2010-05-22 2 views
3

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

Это идет немного что-то вроде этого:

$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]; 
} 

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

ответ

5

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

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

Или, вместо array_merge, вы можете используйте + op, который выполняет соединение:

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

Это один работает с числовыми ключами или смешанных численными/строк :)

+0

О, вау, мне это нравится! Удивительный ответ – Alistair

+0

Это не работает так хорошо, если $ array1 содержит числовые ключи ... – Industrial

+1

@ Промышленный: он работает для вашего примера! ;) Имеет ли массив только числовые клавиши или смесь? – Chris

-1

Вы посмотрели массив_комбината? Вот ссылка: PHP reference

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

+0

Array_combine не присоединяется к массивам таким образом. Он создает ассоциированный массив из двух массивов. Один для ключей и один для значений. – Beachhouse

0

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

1

Вместо того, чтобы бросать ошибки проверить, что основные выходы с помощью array_key_exists

<?php 
foreach($array1 as $key) { 
    if (array_key_exists($key, $array2)) { 
     $result[$key] = $array2[$key]; 
    } else { 
     $result[$key] = null; 
    } 
} 
0

В этом случае вы можете использовать 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

Привет! Меня беспокоят буквальные части. Что происходит, когда нет? – Industrial

0

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

$array1 = (array)$array2 + (array)$array1;