Проверка двух массивов
Доброго времени суток.
Подскажите пожалуйста, нужно проверить array1 с array2 по полям line_id и u_id, если они совпадают то на выходе расширить array1 добавив туда некоторые поля из array2.
Я пытался пробегаться "foreach" по "array1" и подставляя "index", проверять "array2", но этот способ не подошел, т.к. "array2" может приходить с другой сортировкой и тогда проверяемые не подходят по index. Хотя в них присутствуют одинаковые line_idи u_id, но т.к. у array2 изменилась сортировка , проверка не проходит.
array1 = [
0 => array:3 [
"line_id" => "1cc6c7634863f0dbeb6c6252e788a276"
"product" => 123
"case" => false]
1 => array:3 [
"line_id" => "59f0fdf1d94b281474937d16f15d7360"
"product" => 456
"case" => 20
] ]
array2 [
0 => array:18 [
"u_id" => "59f0fdf1d94b281474937d16f15d7360"
"product" => 123
"case" => false]
1 => array:18 [
"u_id" => "1cc6c7634863f0dbeb6c6252e788a276"
"product" => 456
"case" => 20
] ]
Вот пример как я пробовал:
foreach($array2['items'] as $key => $item) {
if($item['u_id'] == $array2[$key]['line_id']) {
$items[$key]['doc'] = $discount['doc'] ?? '';
$items[$key]['sale'] = $discount['sale'] ?? 0;
};
};
это не подходит, т.к. например в обоих массивах есть значение "59f0fdf1d94b281474937d16f15d7360", но в array1 оно находится в массиве с индексом "1", а в array2, с индексом "0", и тогда если{ if ($array2[$key] == $value {....})} в $key будет 0, а в текущей итерации у array1 с индексом 0 в поле row_id находится 1cc6c7634863f0dbeb6c6252e788a276, что не соотвествует 59f0fdf1d94b281474937d16f15d7360 индекса 0 массива array2
Ответы (1 шт):
Научиться решать такие задачи поможет опыт в материальном мире. Возьмём несколько бумажек (офисных стикеров) и на каждой напишем по одному знеачению из массивов. Сложим бумажки в две стопки $array1 и $array2. Как теперь вы бы руками сделали то, что хотите запрограммировать?
Я сейчас напишу как бы поступил я, но не спешите просто копировать моё решение (так вы ничему не научитесь), проделайте опыт сами.
- берём бумажку из стопки $array1. На ней написано
row_id: 1cc6c7634863f0dbeb6c6252e788a276
...
- теперь нам надо пролистать стопку $array2, и найти в ней бумажку, на которой написано
uniq_id: 1cc6c7634863f0dbeb6c6252e788a276
...
- теперь допишем в бумажку из стопки $array1 doc и sale с найденой бумажки из $array2;
- переходим к первому шагу.
Порядок бумажек в $array1 и $array2 значения не имеет. Потому что мы каждый раз перебираем бумажки из $array2, чтобы найти подходящую. Получается цикл в цикле.
Этот алгоритм можно улучшить. Например можно убирать из стопки $array2 бумажки, которые уже совпали с бумажками из $array1. Тогда искать в оставщихся бумажках из $array2 будет каждый раз быстрее.
Но есть ещё одна идея. Что если предварительно пролистать всю стопку $array2 и составить справочник какой uniq_id на каком месте в стопке? Теперь на втором шаге нам не надо листать всю стопку $array2. Мы просто смотрим в справочник и достаём нужную бумажку. Роль справочника в php играет ассоциативный массив (почитайте что такое хэш-таблица).