如果另一个多维数组中存在数组值,如何检查和替换数组

时间:2019-01-11 07:36:35

标签: php arrays

我有两个数组,我想根据day_of_weekstatus的值比较数组。

如果day_of_week存在于另一个数组中,并且status为1,则用匹配的数组替换该数组。

$ array1

Array
(
    [0] => Array
        (
            [id] => 4
            [day_of_week] => sun
            [description] => sun test description
            [status] => 0
            [date] => 2019-01-11
        )

    [1] => Array
        (
            [id] => 5
            [day_of_week] => mon
            [description] => mon test description
            [status] => 0
            [date] => 2019-01-11
        )
)

$ array2

Array
(
    [0] => Array
        (
            [id] => 1
            [day_of_week] => mon
            [description] => mon updated test description
            [status] => 1
            [date] => 2019-01-11
        )
)

所需的输出:

Array
(
    [0] => Array
        (
            [id] => 4
            [day_of_week] => sun
            [description] => sun test description
            [status] => 0
            [date] => 2019-01-11
        )

    [1] => Array
        (
            [id] => 1
            [day_of_week] => mon
            [description] => mon updated test description
            [status] => 1
            [date] => 2019-01-11
        )
)

我尝试使用array_intersect函数,但是找不到基于day_of_weekstatus比较值的解决方案。谁能帮我吗?

$array = array_intersect($array1, $array2);

3 个答案:

答案 0 :(得分:2)

似乎可以通过循环完成

$array2 = array_column($array2, null, 'day_of_week');
foreach ($array1 as $k=>$x) {
  if (isset($array2[$x['day_of_week']]) and $array2[$x['day_of_week']]['status'] == 1) {
      $array1[$k] = $array2[$x['day_of_week']];
  }
}

demo

答案 1 :(得分:2)

由于星期几在数组中是唯一的,因此您可以使用array_column()以此索引两个数组,并可以使用array_replace()将第二个数组中的数据替换为第一个数组。

另外(感谢splash58),您需要过滤第二个数组以只保留状态为1 ...的数组。

$array2 = array_filter($array2, function($entry) { return $entry['status'] == '1'; });
$array1 = array_column($array1, null, "day_of_week");
$array2 = array_column($array2, null, "day_of_week");
$array1 = array_replace($array1, $array2);

print_r(array_values($array1));

最后使用array_values()会删除索引,以备不时之需。

答案 2 :(得分:2)

您可以使用array_map处理$array1的每个元素,并检查它是否在$array2中相对应(在day_of_week列中使用array_search定位)有status == 1。如果是这样,请返回$array2中的元素,否则保留$array1中的值:

$array1 = array_map(function ($v) use ($array2) {
    if (($k = array_search($v['day_of_week'], array_column($array2, 'day_of_week'))) !== false && $array2[$k]['status'] == 1)
        return $array2[$k];
    else
        return $v;
}, $array1);
print_r($array1);

输出:

Array ( 
    [0] => Array ( [id] => 4 [day_of_week] => sun [description] => suntestdescription [status] => 0 [date] => 2019-01-11 )
    [1] => Array ( [id] => 1 [day_of_week] => mon [description] => monupdatedtestdescription [status] => 1 [date] => 2019-01-11 ) 
)

Demo on 3v4l.org