PHP: как совместить два многомерных массива

Я придерживался этого и действительно не знаю, как его решить. У меня есть два многомерных массива и вам нужно сопоставить каждый «entry_id» со вторым массивом с первым. Затем нужно проверить, соответствуют ли все «file_no» из второго массива в базе данных (первый массив) и «статус» с 1-м массивом. Если «статус» отличается, обновите второй массив со строкой (например, обновленное значение) следующим образом:

... [status] => Array ( [0] => abc [1] => defghijk - "updated value" ) 

Итак, у меня есть первый массив из базы данных:

 Array ( [0] => Array ( [entry_id] => 1 [file_no] => KSBR 40 INS 3674 / 2014 [status] => abc ) [1] => Array ( [entry_id] => 9 [file_no] => KSUL 77 INS 18898 / 2013 [status] => abc ) [2] => Array ( [entry_id] => 9 [file_no] => KSUL 77 INS 21218 / 2013 [status] => defg ) ) 

И второй массив, созданный из сценария:

 Array ( [0] => Array ( [entry_id] => 1 [id] => 500910/098 [fullname] => Milan Vrtal [type] => person [file_no] => Array ( [0] => KSBR 26 INS 37146 / 2013 [1] => KSBR 40 INS 3674 / 2014 ) [status] => Array ( [0] => status1 [1] => status2 ) ) [1] => Array ( [entry_id] => 2 [id] => 46900217 [fullname] => ENTEC as [type] => company [file_no] => Array ( [0] => KSBR 28 INS 1232 / 2013 ) [status] => Array ( [0] => qwer ) ) [2] => Array ( [entry_id] => 9 [fullname] => Blanka Kořínková [type] => person [file_no] => Array ( [0] => KSUL 77 INS 18898 / 2013 [1] => KSUL 77 INS 21218 / 2013 ) [status] => Array ( [0] => abc [1] => defghijk ) ) ) 

Спасибо за каждый комментарий и извините за английский 🙂

Related of "PHP: как совместить два многомерных массива"

Это путем создания временного массива для поиска. Это будет использовать довольно некоторую память, когда массивы большие, но приведет к более быстрому времени выполнения …

 $tmparr = array(); foreach($arr1 as $arr1_val) { //put an new element in $temparr with key 'entry_id' and an array as value if (!isset($tmparr[$arr1_val['entry_id']])) $tmparr[$arr1_val['entry_id']] = array(); //add the status to the array $tmparr[$arr1_val['entry_id']][] = $arr1_val['status']; } /* $tmparr = Array ( [1] => Array ( [0] => abc ) [9] => Array ( [0] => abc [1] => defg ) ) */ //arr2_val by reference so that we can change it foreach($arr2 as &$arr2_val) { //get the current entry_id $entry_id = $arr2_val['entry_id']; //see if this entry_id was in the first array, and if so... if (isset($tmparr[$entry_id])) { //change the status to both the original status and the status of the first array $arr2_val['status'] = array_merge($arr2_val['status'],$tmparr[$entry_id]); } } print_r($arr2); 

Вывод:

 Array ( [0] => Array ( [entry_id] => 1 [id] => 500910/098 [fullname] => Milan Vrtal [type] => person [file_no] => Array ( [0] => KSBR 26 INS 37146 / 2013 [1] => KSBR 40 INS 3674 / 2014 ) [status] => Array ( [0] => status1 [1] => status2 [2] => abc ) ) [1] => Array ( [entry_id] => 2 [id] => 46900217 [fullname] => ENTEC as [type] => company [file_no] => Array ( [0] => KSBR 28 INS 1232 / 2013 ) [status] => Array ( [0] => qwer ) ) [2] => Array ( [entry_id] => 9 [fullname] => Blanka Kořínková [type] => person [file_no] => Array ( [0] => KSUL 77 INS 18898 / 2013 [1] => KSUL 77 INS 21218 / 2013 ) [status] => Array ( [0] => abc [1] => defghijk [2] => abc [3] => defg ) ) ) 

edit: Это тоже возможно, вне массива temp, но с циклом в цикле. Это будет медленнее первого, но будет потреблять меньше памяти:

 //arr2_val by reference so that we can change it foreach($arr2 as &$arr2_val) { //get the current entry_id $entry_id = $arr2_val['entry_id']; //search for the correct row in the first array foreach($arr1 as $arr1_val) { if ($arr1_val['entry_id'] == $arr2_val['entry_id']) { $arr2_val['status'][] = $arr1_val['status']; //a continue should be added here to make it faster... } } } print_r($arr2); 

Это должно работать

  foreach($array1 as $i) { foreach($array2 as $key=>$j) { if($j['entry_id'] == $i['entry_id']) { if($array2[$key]['status'] != $i['status']) { $j['status'] = array( $i['status'], $j['status'] // the new status ); } continue; } } } 

Я нашел решение для вас:

 $a1 = [['entry_id' => 1, 'file_no' => 'KSBR', 'status' => 'abc'], ['entry_id' => 2, 'file_no' => 'KSUL', 'status' => 'defg']]; $a2 = [['entry_id' => 1, 'file_no' => 'KSBR', 'status' => 'abc', 'type' => 'person'], ['entry_id' => 2, 'file_no' => 'KSUL', 'status' => 'defg']]; print_r(new_array_merge_recursive($a1, $a2)); function new_array_merge_recursive(array $array1, array $array2=array()) { $arrays = func_get_args(); $merge = array_shift($arrays); foreach ($arrays as $array) { foreach ($array as $key => $val) { if (is_array($val) && array_key_exists($key, $merge)) { $val = new_array_merge_recursive((array) $merge[$key], $val); } $merge[$key] = $val; } } return $merge; }