【问题标题】:Strange behavior: Undefined index whilst index IS correct奇怪的行为:未定义的索引,而索引是正确的
【发布时间】:2014-11-29 18:54:24
【问题描述】:

我正在尝试从一个深度为 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

【问题讨论】:

  • 我猜speccharacter 里面。所以不应该是$c[$i]['character']['spec']['name'] 吗?还是只是某个地方的错字?
  • for 循环中的第二行不再需要['character']
  • 糟糕!对不起,我的坏,没有先看到它。好的 - 其余的看起来都不错。您是否尝试在违规行之前插入print_r($c[$i])?那里的输出可能会说明出了什么问题,如果您也可以粘贴它,这将有助于我们解决问题。
  • 可能有些数组,(因为输出图片被截断了)确实有未定义的索引,用isset,看看下面的答案

标签: php arrays multidimensional-array indexing


【解决方案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 />";
   }

【讨论】:

    【解决方案2】:

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

    未定义变量的未设置示例: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']
        );
    

    【讨论】:

      猜你喜欢
      • 2012-04-22
      • 1970-01-01
      • 2015-07-12
      • 2023-03-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-04
      相关资源
      最近更新 更多