搜索Array时未定义的偏移量错误

时间:2018-01-19 14:17:54

标签: php arrays multidimensional-array

我在数组中搜索已知值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

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

3 个答案:

答案 0 :(得分: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']);

答案 1 :(得分:0)

这是因为当你在做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附近有多少元素并不重要,它将搜索所有这些元素。

答案 2 :(得分:0)

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