]> git.openstreetmap.org Git - nominatim.git/commitdiff
PHP 8 behaves slightly different with in_array and usort
authorMarc Tobias <mtmail@gmx.net>
Tue, 10 May 2022 16:30:49 +0000 (18:30 +0200)
committerMarc Tobias <mtmail@gmx.net>
Sun, 3 Jul 2022 08:55:34 +0000 (10:55 +0200)
lib-php/ParameterParser.php
lib-php/SimpleWordList.php
test/php/Nominatim/ParameterParserTest.php
test/php/Nominatim/SimpleWordListTest.php

index 98b95388ce678f7d52a2711dc18b29829414801d..070be36c24a3856448ef3de965298690001dac33 100644 (file)
@@ -70,7 +70,7 @@ class ParameterParser
             return $sDefault;
         }
 
-        if (!in_array($this->aParams[$sName], $aValues)) {
+        if (!in_array($this->aParams[$sName], $aValues, true)) {
             userError("Parameter '$sName' must be one of: ".join(', ', $aValues));
         }
 
index ecd02153da7439b947e0899e5a176b17be033273..7009d370f9bb0e992f49eb47547ce5ef950b0f5b 100644 (file)
@@ -120,13 +120,18 @@ class SimpleWordList
         return array_slice($aWordSets, 0, SimpleWordList::MAX_WORDSETS);
     }
 
+    /**
+     * Custom search routine which takes two arrays. The array with the fewest
+     * items wins. If same number of items then the one with the longest first
+     * element wins.
+     */
     public static function cmpByArraylen($aA, $aB)
     {
         $iALen = count($aA);
         $iBLen = count($aB);
 
         if ($iALen == $iBLen) {
-            return 0;
+            return strlen($aB[0]) <=> strlen($aA[0]);
         }
 
         return ($iALen < $iBLen) ? -1 : 1;
index 1488c987a22218f82b97471ec54f57c40c9404dc..7381bdf84a9cca05f13a0aff3ce6f0804076d62b 100644 (file)
@@ -137,6 +137,9 @@ class ParameterParserTest extends \PHPUnit\Framework\TestCase
 
     public function testGetSet()
     {
+        $this->expectException(\Exception::class);
+        $this->expectExceptionMessage("Parameter 'val3' must be one of: foo, bar");
+
         $oParams = new ParameterParser(array(
                                         'val1' => 'foo',
                                         'val2' => '',
@@ -148,7 +151,7 @@ class ParameterParserTest extends \PHPUnit\Framework\TestCase
         $this->assertSame('foo', $oParams->getSet('val1', array('foo', 'bar')));
 
         $this->assertSame(false, $oParams->getSet('val2', array('foo', 'bar')));
-        $this->assertSame(0, $oParams->getSet('val3', array('foo', 'bar')));
+        $oParams->getSet('val3', array('foo', 'bar'));
     }
 
 
index fe543b3faaaaabc09d757e3de698f9f8445523a5..69cb51809178352d99bbe4df94599d281934f8ed 100644 (file)
@@ -77,7 +77,7 @@ class SimpleWordListTest extends \PHPUnit\Framework\TestCase
 
         $oList = new SimpleWordList('a b c');
         $this->assertEquals(
-            '(a b c),(a|b c),(a b|c),(a|b|c)',
+            '(a b c),(a b|c),(a|b c),(a|b|c)',
             $this->serializeSets($oList->getWordSets(new TokensFullSet()))
         );
 
@@ -88,6 +88,22 @@ class SimpleWordListTest extends \PHPUnit\Framework\TestCase
         );
     }
 
+    public function testCmpByArraylen()
+    {
+        // Array elements are phrases, we want to sort so longest phrases are first
+        $aList1 = array('hackney', 'bridge', 'london', 'england');
+        $aList2 = array('hackney', 'london', 'bridge');
+        $aList3 = array('bridge', 'hackney', 'london', 'england');
+
+        $this->assertEquals(0, \Nominatim\SimpleWordList::cmpByArraylen($aList1, $aList1));
+
+        // list2 "wins". Less array elements
+        $this->assertEquals(1, \Nominatim\SimpleWordList::cmpByArraylen($aList1, $aList2));
+        $this->assertEquals(-1, \Nominatim\SimpleWordList::cmpByArraylen($aList2, $aList3));
+
+        // list1 "wins". Same number of array elements but longer first element
+        $this->assertEquals(-1, \Nominatim\SimpleWordList::cmpByArraylen($aList1, $aList3));
+    }
 
     public function testMaxWordSets()
     {