2012-11-06 12 views
6

Recentemente ho notato problemi durante l'utilizzo della funzione array_search nel mio codice. Sto cercando l'array "$ allcraftatts" per il valore "sharp". Ho cercato di isolare il problema attraverso la creazione di un esperimento di due linee:PHP array_search restituisce costantemente la prima chiave dell'array

$testcopy=$allcraftatts; 
$testsharp=array_search("sharp", $testcopy); 

Utilizzando "print_r (get_defined_vars());" più avanti, ottengo questo risultato:

[testcopy] => Array 
       (
        [0] => 0 
        [1] => 0 
        [2] => 0 
        [3] => 0 
        [4] => 0 
        [5] => 0 
        [6] => Sharp Stone 
        [7] => Sharp Stones 
        [8] => stone 
        [9] => object 
        [10] => sharp 
        [11] => hard 
        [12] => 0 
        [13] => 0 
        [14] => 0 
        [15] => 0 
        [16] => 0 
        [17] => 0 
        [18] => 0 
       ) 

[testsharp] => 0 

Mi sono assicurato che non modifico queste variabili in nessun altro momento.

Ora, se cambio il mio codice di

$testcopy=$allcraftatts; 
unset($testcopy[0]); 
$testsharp=array_search("sharp", $testcopy); 

esso restituisce "1".

Questo mi porta a credere che restituisca sempre la prima chiave nell'array.

Mi sconcerta! Questo è uno di quei bug che ti fa temere qualcosa di sbagliato con il linguaggio stesso. Comunque sia dubbio, alla fine sono stato spinto a guardare alla fonte PHP per qualcosa di sbagliato lì, ma sfortunatamente non riuscivo a capirlo.

Vedendo che è una funzione semplice come questa, sarò sicuramente completamente umiliato dalla risposta inevitabilmente semplice, ma a questo punto, voglio solo una risposta.

+0

Quale versione di PHP stai usando? Puoi anche mostrarci l'output di un 'var_dump' su quelle variabili invece di' print_r'? Mostrerà se hai degli spazi in più (che è un comune problema di persone con esperienza con 'array_search') –

risposta

8

array_search sta usando == per confrontare i valori durante la ricerca

FORMA PHP DOC

Se il terzo parametro strict è TRUE la funzione array_search() ricerca per elementi identici nel pagliaio. Ciò significa che controllerà anche i tipi di ago nel pagliaio e gli oggetti devono essere la stessa istanza.

Lo stavano ristrutturando il primo elemento è 0 la stringa è stato convertito in 0 durante la ricerca

semplice test

var_dump("sharp" == 0); //true 
var_dump("sharp" === 0); //false 

uso Soluzione strict opzione per cercare valori identici

$testsharp = array_search("sharp", $testcopy,true); 
               ^---- Strict Option 

var_dump($testsharp); 

uscita

10 
2

Se qualsiasi tasto prima di quello cercato è numerico pari a zero, tale chiave viene restituito, in quanto esegue un match "loose" dominato dal tipo di dati dell'array , e "taglienti" (se convertito a int) conta come zero. Utilizzando un controllo rigoroso, viene trovato il valore corretto.

Altrimenti, eseguendo

$testcopy = array_map('strval', $testcopy); 

modo che i valori sono convertiti in stringhe, funziona anche con controllo "loose".

1

Benvenuti nel meraviglioso mondo della digitazione libera. In php, array_search imposta come valori di default non confronti ("=="), ma è possibile aggiungere un terzo parametro per forzare strict ("==="). Quasi sempre vuoi essere severo, anche se ci sono dei momenti in cui il non-stringere è l'operazione corretta.

check out il seguente:

$allcraftatts = array(0, 0, 0, 0, 0, 0, "Sharp Stone", "Sharp Stones", "stone", new stdClass(), "sharp", "hard", 0, 0, 0, 0, 0,0 ,0); 
$testcopy=$allcraftatts; 
$testsharp=array_search("sharp", $testcopy); 
$testsharpStrict=array_search("sharp", $testcopy, true); 

print_r(get_defined_vars());                                                       

if(0 == "sharp"){ 
    echo "true for == \n"; 
}else{ 
    echo "false == \n"; 
} 
if(0 === "sharp"){ 
    echo "true for === \n"; 
}else{ 
    echo "false === \n"; 
} 

e l'uscita:

[testcopy] => Array 
     (
      [0] => 0 
      [1] => 0 
      [2] => 0 
      [3] => 0 
      [4] => 0 
      [5] => 0 
      [6] => Sharp Stone 
      [7] => Sharp Stones 
      [8] => stone 
      [9] => stdClass Object 
       (
       ) 

      [10] => sharp 
      [11] => hard 
      [12] => 0 
      [13] => 0 
      [14] => 0 
      [15] => 0 
      [16] => 0 
      [17] => 0 
      [18] => 0 
     ) 

    [testsharp] => 0 
    [testsharpStrict] => 10 
) 
true for == 
false === 
Problemi correlati