Слияние двух массивов в PHP - PullRequest
3 голосов
/ 23 мая 2010

Я пытаюсь создать новый массив из двух текущих массивов.Пробовал array_merge, но он не даст мне то, что я хочу.$array1 - это список клавиш, которые я передаю функции.$array2 содержит результаты этой функции, но не содержит недоступных результатов для ключей.Итак, я хочу убедиться, что все запрошенные ключи имеют значения 'null': ed, как показано в массиве $result.

Это выглядит примерно так:

$array1 = array('item1', 'item2', 'item3', 'item4');

$array2 = array(
    'item1' => 'value1',
    'item2' => 'value2',
    'item3' => 'value3'
);

Вот результат, который я хочу:

$result = array(
    'item1' => 'value1',
    'item2' => 'value2',
    'item3' => 'value3',
    'item4' => ''  
);

Это можно сделать таким образом, но я не думаю, что это хорошее решение - я действительно не люблю выбирать легкий путьи подавить ошибки PHP, добавив в код @: s.Этот пример, очевидно, будет выдавать ошибки, поскольку 'item4' не входит в $array2, на основе примера.

foreach ($keys as $k => $v){
    @$array[$v] = $items[$v]; 
}

Итак, каков самый быстрый (с точки зрения производительности) способ достижения того же результата?*

Ответы [ 6 ]

5 голосов
/ 23 мая 2010

array_fill_keys создаст вам хороший массив, который вы можете использовать в array_merge:

array_merge(array_fill_keys($array1, ''), $array2);

Или вместо array_merge вы можете использовать опцию +, которая выполняет объединение:

$array2 + array_fill_keys($array1, '');

Этот работает с цифровыми клавишами или смешанными цифрами / строками:)

1 голос
/ 23 мая 2010

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

<?php
 foreach($array1 as $key) {
    if (array_key_exists($key, $array2)) {
        $result[$key] = $array2[$key];
    } else {
        $result[$key] = null;
    }
 }
0 голосов
/ 14 декабря 2012

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

$array1 = (array)$array2 + (array)$array1;
0 голосов
/ 23 мая 2010

В этом случае вы можете использовать array_merge и array_fill_keys :

$result = array_merge(
    array_array_fill_keys($array1,''),
    $array2
);

Вы должны знать, что с array_merge значение в последнем массиве перезаписывает первые, только если ключи не являются числами, и, следовательно, этот метод не будет работать, если $ array1 содержит числовые значения. Например, при вводе следующих значений этот код не будет работать должным образом:

$array1 = array(1,2,3);
$array2 = array("hi"=>"world",2=>"test","other"=>"empty");

Будет производить следующее:

array(6) {
  [0]=>
  string(0) ""
  [1]=>
  string(0) ""
  [2]=>
  string(0) ""
  ["hi"]=>
  string(5) "world"
  [3]=>
  string(4) "test"
  ["other"]=>
  string(5) "empty"

}

Если вы уверены, что все ключи массива являются литералами, вы можете использовать их без забот

0 голосов
/ 23 мая 2010

Вы можете использовать array_merge() для объединения одного или нескольких массивов.

0 голосов
/ 23 мая 2010

Вы смотрели на array_combine? Вот ссылка: Ссылка PHP

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

...