Сравните два многомерных массива и замените значения на основе соответствующих ключей - PullRequest
0 голосов
/ 01 октября 2018

У меня есть 2 массива разной длины:

$array1 = Array
(
    [0] => Array
        (
            ['_id'] => "Group1"
            ['M'] => 0
            ['F'] => 0
        )
    [1] => Array
        (
            ['_id'] => "Group2"
            ['M'] => 0
            ['F'] => 0
        )
    [2] => Array
        (
            ['_id'] => "Group3"
            ['M'] => 0
            ['F'] => 0
        )
    [3] => Array
        (
            ['_id'] => "Group4"
            ['M'] => 0
            ['F'] => 0
        )
)


$array2 = Array
(
    [0] => Array
        (
            ['_id'] => "Group2"
            ['M'] => 180
            ['F'] => 200
        )
    [1] => Array
        (
            ['_id'] => "Group4"
            ['M'] => 360
            ['F'] => 500
        )
)

Я хочу сравнить значения ['_id'] в обоих массивах и , если они совпадают , я буду замените значения из ['M'] и ['F'] в массиве 1 на значения из массива 2 на основе соответствующего ['_id].

Так что мой желаемый выходной результатбыло бы:

$array1 = Array
(
    [0] => Array
        (
            ['_id'] => "Group1"
            ['M'] => 0
            ['F'] => 0
        )
    [1] => Array
        (
            ['_id'] => "Group2"
            ['M'] => 180
            ['F'] => 200
        )
    [2] => Array
        (
            ['_id'] => "Group3"
            ['M'] => 360
            ['F'] => 500
        )
    [3] => Array
        (
            ['_id'] => "Group4"
            ['M'] => 0
            ['F'] => 0
        )
)

Это мой код, но я не могу заменить значения новыми.Значения остаются такими же, как и раньше.

foreach ($array1 as $defArr)
{
  foreach ($array2 as $dayArr)
  {
    if($dayArr['_id'] == $defArr['_id'])
    {
      $defArr['M'] = $dayArr['M'];
      $defArr['F'] = $dayArr['F'];
    }
  }
}

Ответы [ 2 ]

0 голосов
/ 01 октября 2018

Это может быть односимвольное изменение:

foreach ($array1 as $defArr)

переходит на

foreach ($array1 as &$defArr)
#                   ^

Оператор ссылки & указывает на исходный подмассив в цикле foreachконтекст, а не временная переменная.

Тем не менее, немного безопаснее использовать индекс явно:

foreach ($array1 as $i => $defArr) {
    foreach ($array2 as $j => $dayArr) {
        if ($dayArr['_id'] == $defArr['_id']) {
            $array1[$i]['M'] = $array2[$j]['M'];
            $array1[$i]['F'] = $array2[$j]['F'];
        }
    }
}

Если важна скорость или $array2 велика, временная сложность вашегоАлгоритм O (n * m).Я рекомендую хеширование $array2 для быстрого поиска следующим образом (O (n)):

$lookup = array_reduce($array2, function ($a, $e) {
    $a[$e['_id']] = $e;
    return $a;
});

foreach ($array1 as $i => $e) {
    if (array_key_exists($e['_id'], $lookup)) {
        $array1[$i]['M'] = $lookup[$e['_id']]['M'];
        $array1[$i]['F'] = $lookup[$e['_id']]['F'];
    }
}

Попробуйте!

0 голосов
/ 01 октября 2018
<?php
$array1 = [['_id'=>'abc','M'=>0,'F'=>0],['_id'=>'abcd','M'=>0,'F'=>0],['_id'=>'abcde','M'=>0,'F'=>0]];

$array2 = [['_id'=>'abc','M'=>50,'F'=>300],['_id'=>'abcde','M'=>600,'F'=>700]];

foreach($array2 as $key=> $array2value){
  $searched_in_array_1= array_search($array2value['_id'],array_column($array1,'_id'));
  if(is_numeric($searched_in_array_1)) $array1[$searched_in_array_1] = $array2value;
}

var_dump($array1);
?>

Вы хотите получить помощь по функциям массива php при работе с массивами.Я использовал array_column и array_search функции для этого

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...