php
大家幫忙看一下,兩次分別給函數輸入數組,兩次輸入的數組用print_r列印出來看著是一樣的,但是經過一個簡單的函數之後出來結果就不一樣了。看下面的代碼和輸出:
function getKey($arr) {return $arrKey = array_keys($arr, 'aa');}$testArr = array('0'=>'XX','aa'=>'XX','1'=>'YY','bb'=>'YY','2'=>'ZZ','cc'=>'ZZ');$array1 = array_keys($testArr);$array2 = array('0', 'aa', '1', 'bb', '2','cc');print_r($array1);echo '
';print_r($array2);echo '
';print_r(getKey($array1));echo '
';print_r(getKey($array2));
我這裡的輸出結果是這樣的:
Array ( [0] => 0 [1] => aa [2] => 1 [3] => bb [4] => 2 [5] => cc )
Array ( [0] => 0 [1] => aa [2] => 1 [3] => bb [4] => 2 [5] => cc )
Array ( [0] => 0 [1] => 1 )
Array ( [0] => 1 )
前面兩個一樣,後面兩個卻不一樣,我懷疑可能是輸入的兩個數組用print_r列印出來一樣,但其實內部有東西是不一樣的,但是怎樣能看到這種不同呢?然後到底有什麼不同呢?
希望懂的不吝賜教,先謝過了。
回複討論(解決方案)
return $arrKey = array_keys($arr, 'aa',true);
會得到相同的結果
array_keys 中 0 和 '0' 是有區別的
這一點你可以用 var_dump 觀察到
array_keys($arr, 'aa')
是傳回值為 aa 的元素的鍵
當值為 0 時, 'aa' == 0 因為一邊是數值,所以 aa 會轉換為 0 進行比較,運算式成立
當值為 '0' 時, 'aa' == '0' 因為兩邊是字串,無需轉換,運算式不成立成立
'XX','aa'=>'XX','1'=>'YY','bb'=>'YY','2'=>'ZZ','cc'=>'ZZ'); $array1 = array_keys($testArr); $array2 = array('0', 'aa', '1', 'bb', '2','cc'); var_dump($array1); echo '
'; var_dump($array2); echo '
'; print_r(getKey($array1)); echo '
'; print_r(getKey($array2)); echo '
'; $arr = array(0,'xx',0,'bb'); print_r(array_keys($arr, 'aa'));?>
得到的結果:
array
0 => int 0
1 => string 'aa' (length=2)
2 => int 1
3 => string 'bb' (length=2)
4 => int 2
5 => string 'cc' (length=2)
array
0 => string '0' (length=1)
1 => string 'aa' (length=2)
2 => string '1' (length=1)
3 => string 'bb' (length=2)
4 => string '2' (length=1)
5 => string 'cc' (length=2)
Array ( [0] => 0 [1] => 1 )
Array ( [0] => 1 )
Array ( [0] => 0 [1] => 2 )
看出什麼了嗎 array_keys(array,value,strict) php是弱語言數字0被當成某個字元處理了 所以strict要指定為true
如果 strict 參數指定為 true,則 PHP 會使用全等比較 (===) 來嚴格檢查索引值的資料類型。
感謝microlab2009和xuzuning的詳細指導,這下很明白了。