Создать новый массив с использованием 2 разных массивов в php

У меня есть 2 массива, как это. Array1:

Array
(
    [abu-garcia] => 1
    [daiwa] => 4
    [shimano] => 4
)
Array 2:
Array
(
    [0] => Array
        (
            [brand_id] => 36
            [brand_name] => Abu Garcia
            [brand_slug] => abu-garcia
        )

    [1] => Array
        (
            [brand_id] => 41
            [brand_name] => Daiwa
            [brand_slug] => daiwa
        )

    [2] => Array
        (
            [brand_id] => 41
            [brand_name] => Daiwa
            [brand_slug] => daiwa
        )

    [3] => Array
        (
            [brand_id] => 41
            [brand_name] => Daiwa
            [brand_slug] => daiwa
        )

    [4] => Array
        (
            [brand_id] => 41
            [brand_name] => Daiwa
            [brand_slug] => daiwa
        )

    [5] => Array
        (
            [brand_id] => 39
            [brand_name] => Shimano
            [brand_slug] => shimano
        )

    [6] => Array
        (
            [brand_id] => 39
            [brand_name] => Shimano
            [brand_slug] => shimano
        )

    [7] => Array
        (
            [brand_id] => 39
            [brand_name] => Shimano
            [brand_slug] => shimano
        )

Я хочу создать новый массив, который должен выглядеть следующим образом:

    Array
(
    [0] => Array
        (
            [brand_id] => 36
            [brand_name] => Abu Garcia
            [brand_slug] => abu-garcia
            [count] => 1
        )

    [1] => Array
        (
            [brand_id] => 41
            [brand_name] => Daiwa
            [brand_slug] => daiwa
            [count] => 4
        )

    [2] => Array
        (
            [brand_id] => 41
            [brand_name] => Daiwa
            [brand_slug] => daiwa
            [count] => 4
        )

    [3] => Array
        (
            [brand_id] => 41
            [brand_name] => Daiwa
            [brand_slug] => daiwa
            [count] => 4
        )

    [4] => Array
        (
            [brand_id] => 41
            [brand_name] => Daiwa
            [brand_slug] => daiwa
            [count] => 4
        )

    [5] => Array
        (
            [brand_id] => 39
            [brand_name] => Shimano
            [brand_slug] => shimano
            [count] => 4
        )

    [6] => Array
        (
            [brand_id] => 39
            [brand_name] => Shimano
            [brand_slug] => shimano
            [count] => 4
        )

    [7] => Array
        (
            [brand_id] => 39
            [brand_name] => Shimano
            [brand_slug] => shimano
            [count] => 4
        )

Оба там массива создаются WordPress. array1 - это выходной сигнал функции, когда проверяется количество товаров в марке cat, а другой массив предоставляет информацию о марках. Спасибо

4 ответа

Решение

Я думаю, я понимаю, что вы пытаетесь сделать...

Если это примеры ваших массивов:

$CountArray = array("abu-garcia"=>1,
                "daiwa"=>4,
                "shimano"=>4);
$DataArray = array(
            array("brand_id"=>36, "brand_name"=>"Abu Garcia", "brand_slug"=>"abu-garcia"),
            array("brand_id"=>41, "brand_name"=>"Daiwa", "brand_slug"=>"daiwa"),
            array("brand_id"=>39, "brand_name"=>"Shimano", "brand_slug"=>"shimano")
);

Затем переберите второй массив для создания нового массива и добавьте count ключ из первого массива, как это:

$i = 0;
foreach($DataArray as $ItemArray){
    foreach($ItemArray as $Key=>$Value){
        $NewArray[$i][$Key] = $Value;
        $NewArray[$i]['count'] = 0;
        if(isset($CountArray[$ItemArray['brand_slug']])){
            $NewArray[$i]['count'] = $CountArray[$ItemArray['brand_slug']];         
        }
    }
    ksort($NewArray[$i]);
    $i++;
}
print_r($NewArray);

Проще всего это можно сделать так. Предположим, ваше первое имя массива - $first_array, а второе - $second_array.

просто зациклите второй как

foreach($second_array as $index => $item)
{
    $second_array[$index]['count'] = $first_array[$item['brand_slug']];
}

echo "<pre>";
print_r($second_array);

Задача добавления нового столбца ко всем строкам в 2d-массиве на основе массива ассоциативного поиска/отображения наиболее элегантно выполняется с помощьюarray_map()и оператор объединения массивов (+).

Код: (Демо)

      var_export(
    array_map(
        fn($row) => $row + ['count' => $countArray[$row['brand_slug']]],
        $dataArray
    )
);

Также нет ничего плохого в изменении массива данных по ссылке в классическом методе.foreach()петля . (Демо)

      foreach ($dataArray as &$row) {
    $row['count'] = $countArray[$row['brand_slug']];
}
var_export($dataArray);

В качестве соображения, не представленного в образце данных задавшего вопрос, если значение строки не найдено в массиве сопоставления, используйте оператор объединения нулей для возврата к значению по умолчанию.

      ['count' => $countArray[$row['brand_slug']] ?? $someDefault]

Или

      $row['count'] = $countArray[$row['brand_slug']] ?? $someDefault;

array_merge Объединяет элементы одного или нескольких массивов вместе, так что значения одного добавляются в конец предыдущего. Возвращает результирующий массив.

Пример #array_merge() пример

<?php
$array1 = array("color" => "red", 2, 4);
$array2 = array("a", "b", "color" => "green", "shape" => "trapezoid", 4);
$result = array_merge($array1, $array2);
print_r($result);
?>
Другие вопросы по тегам