【问题标题】:how to search in array to find all sub arrays that contain a certain value如何在数组中搜索以查找包含某个值的所有子数组
【发布时间】:2017-10-17 22:41:31
【问题描述】:

我在变量$class 中放置了一个数组,该数组由每个包含 2 个学生 ID 的子数组组成, 我正在尝试查找包含某个 id 的所有子数组,例如 11 我想将所有包含此 id 的数组保存在一个变量中。

数组示例

Array
(
    [0] => Array
        (
            [s1] => 6
            [s2] => 37
        )

    [1] => Array
        (
            [s1] => 8
            [s2] => 11
        )

    [2] => Array
        (
            [s1] => 11
            [s2] => 48
        )

)

代码

foreach ($class as $key => $value) {
    if(!in_array($id, $class)){
        unset($class[$key]);
    }
}

【问题讨论】:

  • if(!in_array($id, $class)){ 更改为 if(!in_array($id, $value)){ - 另外,但这可能取决于个人喜好:我不喜欢在循环遍历数组时更改数组。虽然它在 PHP 中看起来通常是安全的,但我已经习惯不这样做了。在这种特殊情况下,我只需将所有 匹配 值放入一个新数组中,并保持原始不变。
  • @ccKep 仍然得到一个空的 Array()
  • Works fine for me? 您是否使用不同的 ID 多次这样做?由于您要更改原始 $class 数组,因此第二次搜索可能会产生意外结果(例如,在搜索 11 后搜索 6 会返回一个空数组,因为第一次搜索会将数组缩减为仅包含 @ 的对987654332@,并且这些对都不再包含6
  • 糟糕...我正在写答案,而您已经在 cmets 中描述了同样的事情!我的错。
  • @mirvatJ 那么你没有在这个问题中提供所有必需的信息。如链接所示,此代码适用于您提供的结构。

标签: php arrays foreach


【解决方案1】:

你很接近。如果您使用 in_array() 循环并引用正确的变量,它将按照您的需要工作。然后将匹配的数组分配给一个新的数组 var 以供以后使用(这样您就不会更改原始数组!):

$id = 11;
$matched = array();
foreach ($class as $i => $students) {
    if ( in_array($id, $students) ) {
        $matched[] = $class[$i];
    }
}

print_r($matched);

会导致:

Array (
     [0] => Array
         (
             [s1] => 8
             [s2] => 11
         )
     [1] => Array
         (
             [s1] => 11
             [s2] => 48
         )
     )

【讨论】:

  • $matched[] = $students; 也适用于上述示例。
【解决方案2】:

关联数组 http://php.net/manual/es/function.array-search.php

$class = array(array("s1"=>6, "s2"=>37),array("s1"=>8,"s2"=>11),array("s1"=>11, "s2"=>48));
$id = 11;
foreach ($class as $key => $value) {
    if(!array_search($id, $value)){
        unset($class[$key]);
    }
}

抱歉,您可以关注此答案 using array_search for multi dimensional array

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-01
  • 2020-10-21
相关资源
最近更新 更多