2010-07-20 3 views
176

Как слить два массива (один со строками => пары значений и другой с парами значений int =>), сохраняя ключи string/int? Ни один из них никогда не будет перекрываться (потому что у одного есть только строки, а у другого есть только целые числа).PHP: объединить два массива, сохраняя ключи вместо переиндексации?

Вот мой текущий код (который не работает, потому что array_merge повторно индексировать массив с целыми ключами):

// get all id vars by combining the static and dynamic 
$staticIdentifications = array(
Users::userID => "USERID", 
Users::username => "USERNAME" 
); 
// get the dynamic vars, formatted: varID => varName 
$companyVarIdentifications = CompanyVars::getIdentificationVarsFriendly($_SESSION['companyID']); 
// merge the static and dynamic vars (*** BUT KEEP THE INT INDICES ***) 
$idVars = array_merge($staticIdentifications, $companyVarIdentifications); 
+1

Это странно: по странице док PHP, array_merge * не * сделать это. Являются ли строковые ключи фактически строковыми представлениями целых чисел? – owenmarshall

+0

array_merge переиндексирует мой второй массив. т.е. он меняет массив от 'array (123 =>" VALUE123 ")' to 'array (0 =>" VALUE123 ")' – Garrett

+0

хм, это интересно. Я полагаю, что PHP-документация может быть немного неясной в этом вопросе. В нем говорится, что произойдет, если * все * массивов имеют числовые ключи, но в нем конкретно не говорится, что произойдет, если они этого не сделают. –

ответ

419

Вы просто можете «добавить» массивы:

>> $a = array(1, 2, 3); 
array (
    0 => 1, 
    1 => 2, 
    2 => 3, 
) 
>> $b = array("a" => 1, "b" => 2, "c" => 3) 
array (
    'a' => 1, 
    'b' => 2, 
    'c' => 3, 
) 
>> $a + $b 
array (
    0 => 1, 
    1 => 2, 
    2 => 3, 
    'a' => 1, 
    'b' => 2, 
    'c' => 3, 
) 
+34

WOW no way! перегрузка оператора в php ftw! thanks =) – Garrett

+3

Работал как шарм. –

+35

Будьте ОЧЕНЬ осторожны с этим! Оператор + не является дополнением, это объединение. Если клавиши не перекрываются, тогда все хорошо, но если они ... – GordonM

39

Учитывая, что у вас есть

$replaced = array('1' => 'value1', '4' => 'value4'); 
$replacement = array('4' => 'value2', '6' => 'value3'); 

Делая вывод $merge = $replacement + $replaced; воли:

Array('1' => 'value1', '4' => 'value2', '6' => 'value3'); 

Первый массив из суммы будет иметь значения в конечном выходе.

Doing выход $merge = $replaced + $replacement; будет:

Array('1' => 'value1', '4' => 'value4', '6' => 'value3'); 
+0

[[thumbsup]] на этом –

+16

Подводя итог, при добавлении 2 массивов значения из первых значений переопределения из второго. – Dziamid

+0

Я думал, что второй будет отменять первый. :) –

Смежные вопросы