2011-02-26 40 views
3

以下代碼:問題的PHP數組索引

<?php 
$test_array = array(); 
$test_array['string_index'] = "data in string index"; 
$test_array[] = "data in index 0"; 
$test_array[] = "data in index 1"; 
$test_array[] = "data in index 2"; 

foreach($test_array as $key => $val) 
{ 
    if($key != 'string_index') 
    { 
     echo $val."<br>"; 
    } 
} 
?> 

給出結果:

data in index 1 
data in index 2 

問題是 - 哪裏是 「數據在索引0」 ???如何從數字索引0-n獲取元素? 此外,如果我將'string_index'更改爲其他不存在的東西,它會迴應除[0]以外的所有內容。 Plz,給我解釋一下。

日Thnx提前

回答

12

這是因爲人指數0「數據有鍵0在PHP中,0(數字零),'0'(串零),''(空字符串)都是等價的 - 他們可以互相轉換類型。如果你只是做print_r($test_array),你會得到

Array 
(
    [string_index] => data in string index 
    [0] => data in index 0 
    [1] => data in index 1 
    [2] => data in index 2 
) 

另一種選擇將是使用嚴格不等式測試(!==)的比較值和類型。在這種情況下,0 !== 'string index'的計算結果爲true,並且所有內容都按預期工作。

評論隨訪:

,如果你想改變你的循環這個裏面:

echo "key: $key (", gettype($key), ") val: $val (", gettype($val), ")\n"; 
if($key != 'string_index') { 
    echo "$key != 'string_index'\n"; 
} else { 
    echo "$key == 'string_index'\n"; 
} 

您將獲得:

key: string_index (string) val: data in string index (string) 
string_index == 'string_index' 
key: 0 (integer) val: data in index 0 (string) 
0 == 'string_index' 
key: 1 (integer) val: data in index 1 (string) 
1 != 'string_index' 
key: 2 (integer) val: data in index 2 (string) 
2 != 'string_index' 

正如你所看到的,他們」所有 - 這是你的比較失敗,因爲你沒有考慮到PHP的類型轉換/轉換規則。

+3

'0!='字符串索引''也評估爲真,當然。沒有針對空字符串的測試。 –

+0

但0應該是'!='字符串索引'?我的意思是,沒有理智的方式PHP可以形容他們是相同的,可以嗎? – knittl

3

讓我不解的第二太:)你只需要做到的!==不是!=

<?php 
$test_array = array(); 
$test_array['string_index'] = "data in string index"; 
$test_array[0] = "data in index 0"; 
$test_array[] = "data in index 1"; 
$test_array[] = "data in index 2"; 

foreach($test_array as $key => $val) 
{ 
    if($key !== 'string_index') 
    { 
     echo $val."<br>"; 
    } 
} 
?> 

這正好解決您的問題。

0

澄清:
之所以0 != 'string_index'是該字符串是顯然是「向下轉換」,以在字符串/整數比較的整數,並且string_index被解析直到一個字符被遇到不是數字,從而評價對這等於0

1

使用===或空字符串!==的代替==,!=分別,你需要驗證型投一些比較嚴格的運營商。

<?php 
    $test_array = array(); 
    $test_array['string_index'] = "data in string index"; 
    $test_array[] = "data in index 0"; 
    $test_array[] = "data in index 1"; 
    $test_array[] = "data in index 2"; 

    foreach($test_array as $key => $val) 
    { 
     if($key ==='string_index') 
     { 
      //do something 
     }else{ 
      echo $key.$val."<br>"; 
     } 
    } 
?>