2014-10-05 47 views
0

我試圖從一個3層深的數組中訪問一個值,但PHP報告索引是未定義的,而它當然是。取消使用相同的索引工作正常!奇怪的行爲:未定義的索引,雖然索引是正確的

代碼:

function CleanUpCharacters($c) //Remove unneeded information 
{ 
    for ($i = 0; $i < count($c); ++$i) 
    { 
     $c[$i]['character']['rank'] = $c[$i]['rank']; // Move rank in to char 
     $c[$i] = $c[$i]['character']; // Move subarray char's keys/values to parent array 

     unset($c[$i]['battlegroup']); 
     unset($c[$i]['level']); 
     unset($c[$i]['achievementPoints']); 
     unset($c[$i]['thumbnail']); 

     $c[$i]['specName'] = $c[$i]['spec']; // <--- Undefined index notice 
     unset($c[$i]['spec']); // <--- Works fine, no errors 

     unset($c[$i]['guild']); 
     unset($c[$i]['guildRealm']); 
    } 

    return $c; 
} 

的線會導致該錯誤實際上是$c[$i]['specName'] = $c[$i]['spec']['name'];我刪除['name'],看看是否解決了問題,但沒有。

這裏是未經過濾的陣列的截圖,$c

enter image description here

+0

我猜'spec'是在'character'裏面的。所以不應該是'$ c [$ i] ['character'] ['spec'] ['name']'?或者它只是一個錯別字? – 2014-10-05 07:34:14

+0

'for'循環中的第二行刪除了對[['character']'的需求! – 2014-10-05 07:35:13

+0

糟糕!對不起,我先看不到它。好的 - 其餘的看起來不錯。您是否嘗試在違規行之前插入print_r($ c [$ i])?那裏的輸出可能會給出一個關於發生什麼問題的想法,並且如果您也可以粘貼它,這對我們有幫助。 – 2014-10-05 07:44:49

回答

1

未設置()始終有效。它沒有返回值,也不會引發錯誤或通知。

與不確定VAR取消設置例如:http://ideone.com/4OcSkQ

<?php 
unset($a); 

在你的代碼,你需要一個關鍵的所有腦幹檢查,可以做任務之前。

$c[$i]['specName'] = $c[$i]['spec']; // <--- Undefined index notice 

成爲

if(array_key_exists('spec', $c[$i]) === true) { // test, if spec key exists 
     $c[$i]['specName'] = $c[$i]['spec'];   // assign from spec to specName 
    } 

如果您需要登錄或處理相反的情況(規格缺失時),您可以添加一個else:

else { 
     echo 'Key "spec" was not found. Working on: ' . $i['name'] . '<br>'; 
    } 

您也可以刪除更多那麼一個變量unset()就像這樣:

unset(
     $c[$i]['battlegroup'], 
     $c[$i]['level'], 
     $c[$i]['achievementPoints'], 
     $c[$i]['thumbnail'] 
    ); 
1

我沒有看到任何錯誤在這裏。看來對於一些記錄spec可能沒有設置。您可以檢查它改變:

for ($i = 0; $i < count($c); ++$i) { 

for ($i = 0; $i < count($c); ++$i) { 
    if (!isset($c[$i]['character']['spec']) { 
     echo "no spec in array! for ".$i."<br />"; 
    }