奇怪的行为:索引IS正确时未定义的索引

时间:2014-10-05 07:26:59

标签: php arrays multidimensional-array indexing

我试图从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

2 个答案:

答案 0 :(得分: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 />";
   }

答案 1 :(得分:1)

unset()始终有效。它没有返回值,也不会引发错误或通知。

使用未定义的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 {
        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']
    );