Как объединить массив PHP объекта по уникальному идентификатору? - PullRequest
0 голосов
/ 16 ноября 2018

У меня есть эти 2 массива.

Первый массив из пользовательского ввода $cart:

array(3) {
  [0]=>
  array(3) {
    ["id"]=>"3"
    ["weight"]=>"20"
    ["percentage"]=>"80"
  }
  [1]=>
  array(3) {
    ["id"]=>"1"
    ["weight"]=>"50"
    ["percentage"]=>"80"
  }
  [2]=>
  array(3) {
    ["id"]=>"2"
    ["weight"]=>"40"
    ["percentage"]=>"80"
  }
}

и второй массив, я делаю базу данных SELECT id, stock WHERE id IN (3,1,2), в результате $db_item

array(3) {
  [0]=>
  array(2) {
    ["id"]=>"1"
    ["stock"]=>"9539.00"
  }
  [1]=>
  array(2) {
    ["id"]=>"2"
    ["stock"]=>"9468.00"
  }
  [2]=>
  array(2) {
    ["id"]=>"3"
    ["stock"]=>"9295.00"
  }
}

Я хочу добавить атрибут stock во втором массиве в первый массив. Это то, что я пытался, и это работает, но я не думаю, что нужно иметь foreach, array_filter и array_column:

foreach ($cart as $key => $cart_item) {
    $item = array_filter($db_item, function($item) use ($cart_item) {
        return $item['id'] === $cart_item['id'];
    });
    $cart[$key]['stock'] = array_column($item, 'stock')[0];
}

У кого-нибудь есть идеи, как это оптимизировать?


РЕДАКТИРОВАТЬ: после ответ Мухаммеда , я могу использовать больше атрибута во втором массиве

$keys = [];
foreach ($arr2 as $item) {
    $keys[$item['id']] = array(
        'attr1' => $item['attr1'],
        'attr2' => $item['attr2'],
        // and so on
    );
}

$newArr = array_map(function($item) use($keys){
    $item['attr1'] = $keys[$item['id']]['attr1'];
    $item['attr2'] = $keys[$item['id']]['attr2'];
    // and so on
    return $item;
}, $arr1);

EDIT2: обнаружил, что мы можем упростить цикл foreach с помощью одной строки, используя array_column.

$keys = array_column($arr2, null, 'id');

$newArr = array_map(function($item) use($keys){
    $item['attr1'] = $keys[$item['id']]['attr1'];
    $item['attr2'] = $keys[$item['id']]['attr2'];
    // and so on
    return $item;
}, $arr1);

Ответы [ 2 ]

0 голосов
/ 16 ноября 2018

Это тоже может помочь, один массив_колонок + один массив_карт:

$arr2=array_column($arr2,'stock','id');
$arr1=array_map(function($val)use($arr2){$val['stock']=$arr2[$val['id']];return $val;},$arr1);
0 голосов
/ 16 ноября 2018

Используйте комбинацию array_flip() и array_column(), чтобы создать массив, содержащий id и индекс второго массива.

Затем используйте array_map() для добавления нового ключа stock в первый массив.

$keys = array_flip(array_column($arr2, 'id'));
$newArr = array_map(function($item) use($keys, $arr2){ 
    $item['stock'] = $arr2[$keys[$item['id']]]['stock'];
    return $item;
}, $arr1);

Проверьте результат в demo

Также вы можетеиспользуйте foreach вместо array_flip()

$keys = [];
foreach ($arr2 as $item)
    $keys[$item['id']] = $item['stock'];

$newArr = array_map(function($item) use($keys){ 
    $item['stock'] = $keys[$item['id']];
    return $item;
}, $arr1);

Проверьте результат в demo

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