Объединить 3D-массив с 2D-массивом на основе общих значений - PullRequest
0 голосов
/ 22 октября 2011

Мне нужно объединить трехмерный массив с двумерным массивом на основе общего значения 'id.'

В приведенном ниже примере «Джордж Вашингтон» имеет «id» 1. Мне нужно добавить его «значение», которое находится во втором массиве, где «id» также равно 1.

Идентификатор "Джона Адамса" равен 2, чего нет во втором массиве. В результате его 'значение' должно быть установлено в 0 (или NULL).

Окончательный результат представляет собой трехмерный массив, в котором «значение» добавлено к каждому элементу в исходном массиве.

Массив # 1

Array
(
     [0] => Array
         (
             [0] => Array
                 (
                     [id] => 1
                     [name] => "George Washington"
                 )
             [total] => 8
             [average] => 2.5
         )
     [1] => Array
         (
             [0] => Array
                 (
                     [id] => 2
                     [name] => "John Adams"
                 )
             [total] => 6
             [average] => 3.0
         )
     [2] => Array
         (
             [0] => Array
                 (
                     [id] => 5
                     [name] => "James Monroe"
                 )
             [total] => 9
             [average] => 2.0
         )
)

Массив # 2

Array
(
     [0] => Array
         (
             [id] => 1
             [value] => 12
         )
     [1] => Array
         (
             [id] => 5
             [value] => 18
         )
)

Желаемый результат:

Array
(
     [0] => Array
         (
             [0] => Array
                 (
                     [id] => 1
                     [name] => "George Washington"
                 )
             [total] => 8
             [average] => 2.5
             [value] => 12
         )
     [1] => Array
         (
             [0] => Array
                 (
                     [id] => 2
                     [name] => "John Adams"
                 )
             [total] => 6
             [average] => 3.0
             [value] => 0
         )
     [2] => Array
         (
             [0] => Array
                 (
                     [id] => 5
                     [name] => "James Monroe"
                 )
             [total] => 9
             [average] => 2.0
             [value] => 18
         )
 )

Что я пробовал до сих пор:

Я разделил все значения 'id' из первого массива в новый массив с именем $ ids. Затем, просматривая элементы во втором массиве, я проверяю, находится ли 'id' из второго массива в массиве $ ids.

Но потом я застрял, потому что не знаю, как указать, какой элемент в первом массиве должен получить новое 'значение'. Кроме того, это выглядит как грязное решение из-за накладных расходов, связанных с созданием массива $ ids.

1 Ответ

1 голос
/ 22 октября 2011

Даже не подозревал, что вы пытались перечислить идентификаторы и тому подобное, прежде чем я закончил писать это, но все равно вы идете. Удачи!

$array1_size = count($array1);
$array2_size = count($array2);

// Creates a list containing all available IDs of Array1
for ($i = 0; $i < $array1_size; $i ++) {
    $id_list[] = $array1[$i][0]['id'];
    $array1[$i]['value'] = NULL; // Adds a NULL to all value fields
}

// Loops through Array2
for ($i = 0; $i < $array2_size; $i++) {
    if (in_array($array2[$i]['id'], $id_list)) { // Checks if each ID exists in the ID list

        $key = array_search($array2[$i]['id'], $id_list); // Gets the key of the matching ID
        $array1[$key]['value'] = $array2[$i]['value']; // Adds the value

    }
}

Редактировать: Значения теперь по умолчанию установлены в NULL и, следовательно, изменяются позже только при необходимости.

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