获取二维数组中具有特定键/值对的子数组

4

我有一个大的PHP数组,类似于:

$list = array(
    array(
        'id'     = '3243'
        'link'   = 'fruits'
        'lev'    = '1'
    ),
    array(
        'id'     = '6546'
        'link'   = 'apple'
        'lev'    = '2'
    ),
    array(
        'id'     = '9348'
        'link'   = 'orange'
        'lev'    = '2'
    )
)

我想要获取包含特定 id 的子数组。

目前我使用以下代码:

$id = '3243'
foreach ($list as $link) {
    if (in_array($id, $link)) {
        $result = $link;
    }
}

它可以工作,但我希望有更好的方法来做这件事。


2
不是真的,尽管似乎用$link['id'] == $id替换in_array会更好。 - DaveRandom
1
https://dev59.com/hHNA5IYBdhLWcg3wUL1Y - ke20
@ke20 那里的答案大多是针对多维数组的,而这里的解决方案则相对简单一些(因为 OP 的数组只有二维)。 - Armfoot
3个回答

4

您可以

  • 使用$link['id']==$id代替in_array($id, $link),这样会更加高效。
  • $result = $link;后添加break;指令以避免无用的循环。

这个页面本来可以用来关闭未来的重复问题,但可惜被接受的答案不是很干净/易读。也许可以通过添加完整的代码块并保留解释来改进这个答案。 - mickmackusa

2
在PHP 5.4及以上版本中,最简单的方法是结合使用array_filter函数和回调函数中的use语言结构
function subarray_element($arr, $id_key, $id_val = NULL) {
  return current(array_filter(
    $arr,
    function ($subarr) use($id_key, $id_val) {
      if(array_key_exists($id_key, $subarr))
        return $subarr[$id_key] == $id_val;
    }
  ));
}
var_export(subarray_element($list, 'id', '3243')); // returns:
// array (
//   'id' => '9348',
//   'link' => 'orange',
//   'lev' => '2',
// )

current 只返回过滤后数组的第一个元素。以下是一些在线 3v4l 示例,演示如何从 OP 的 $list 中获取不同的子数组。


2

尽管在问题提出时这个答案并不适用,但现在解决这个困境非常简单。

在PHP 5.5中,你可以执行以下操作:

$newList = array_combine(array_column($list,'id'),$list);

接下来的内容将会是真实的:
$newList[3243] = array(
                         'id'   = '3243';
                         'link' = 'fruits'; etc...

3
不,等等。不要这样做。相反,去 PHP 手册中查看 array_column() 的第三个参数并阅读。不应该调用 array_combine() - mickmackusa

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接