【问题标题】:Undefined offset Error when searching Array搜索数组时出现未定义的偏移错误
【发布时间】:2018-01-19 22:57:25
【问题描述】:

我正在一个数组中搜索已知值 wid 以获取密钥,然后该密钥将帮助我获取 cid 值。

$proximity = array(
    '0' => array ('wid' => 4, 'cid' => 100),
    '1' => array ('wid' => 1, 'cid' => 50),
    '3' => array ('wid' => 2, 'cid' => 50)
);

$key = array_search(2, array_column($proximity, 'wid'));
    print_r($key);
    print_r($proximity[$key]['cid']);

当我搜索 wid 41 时,一切正常。

但是,当我搜索 wid: 2 时,我得到了 Undefined offset: 2


为什么会发生这种情况,我该如何解决?

【问题讨论】:

  • print_r($key); 显示什么?
  • @JohnConde '0' => array 行键。
  • $key 的值为 2 并且您的数组中没有键为 2 的元素,因此此错误是有道理的
  • 那是因为你在 $proximity 数组中的 '2' 位置没有任何值。尝试将 $proximity 数组索引中的最后一个元素更改为 '3' 到 '2'
  • @JohnConde 但我不是按关键字搜索,而是使用 array_column 搜索 wid 并获取密钥。确实存在值为 2 的 wid!

标签: php arrays multidimensional-array


【解决方案1】:

Array_column 像通常的索引数组一样返回字段的值,即使源数组是关联的。因此,只有当源数组没有省略索引时,返回的键才是正确的,并且您的搜索实际上是在数组中获取“位置”。

例如对于这样一个数组

$proximity = array(
    'a' => array ('wid' => 4, 'cid' => 100),
    'b' => array ('wid' => 1, 'cid' => 50),
    'c' => array ('wid' => 2, 'cid' => 50)
);

array_column 将返回

Array
(
    [0] => 4
    [1] => 1
    [2] => 2
)

如果您真的想通过 array_column 进行搜索,以解决此问题并通过该“位置”获取项目,请使用

print_r(array_slice($proximity, $key, 1)['cid']);

print_r(array_values($proximity)[$key]['cid']);

【讨论】:

  • 完美!谢谢!
【解决方案2】:

这是因为当你在做array_search()时,它只是搜索数组的第一层,你可以像下面这样搜索:

<?php

echo 'hello world';

$proximity = array(
    '0' => array ('wid' => 4, 'cid' => 100),
    '1' => array ('wid' => 1, 'cid' => 50),
    '3' => array ('wid' => 2, 'cid' => 50)
);

foreach($proximity as $subarray){
    $key = array_search(2, array_column($subarray, 'wid'));
    echo print_r($key) . '<br />';
    echo print_r($proximity[$key]['cid']) . '<br />';
}

?>

这会搜索主数组中的每个子数组,这意味着无论 $proximity 中有多少元素,它都会搜索所有元素。

【讨论】:

  • 我尽量不要有循环。
【解决方案3】:

array_column() 正在破坏您的原始密钥。我不认为使用带中断的循环有什么可耻的。这既干净又快速,按键间隙也没有问题;事实上,如果您需要,您的原始密钥会被保留。

代码:(演示:https://3v4l.org/8XWcf

$proximity = array(
    '0' => array ('wid' => 4, 'cid' => 100),
    '1' => array ('wid' => 1, 'cid' => 50),
    '3' => array ('wid' => 2, 'cid' => 50)
);

$wid=2;
foreach($proximity as $i=>$a){
    if($a['wid']==$wid){
        echo "i=$i and cid={$a['cid']}";
        break;
    }
}

输出:

i=3 and cid=50

如果您不希望控制结构作为迭代器,这似乎是一个明智的选择:

$wid=2;
$proximity=array_column($proximity,NULL,'wid');
if(isset($proximity[$wid])){
    echo "cid={$proximity[$wid]['cid']}";
}else{
    echo 'wid not found';
}

这假定wid 值是唯一的,并使用这些值作为子数组的键。演示:https://3v4l.org/Ph1tH

【讨论】:

  • @borsn 抱歉,我的手机速度很慢。我刚刚阅读了您对另一个答案的评论,说您不想使用循环。我添加了另一种使用 array_column() 与您的 sn-p 不同的方式。
猜你喜欢
  • 2015-11-24
  • 2019-07-24
  • 1970-01-01
  • 2015-12-21
  • 1970-01-01
  • 1970-01-01
  • 2020-08-06
  • 2020-02-17
  • 1970-01-01
相关资源
最近更新 更多