Как я могу сделать array_merge в ассоциативном массиве, например:
Массив 1:
$options = array ( "1567" => "test", "1853" => "test1", );
Массив 2:
$option = array ( "none" => "N/A" );
Так мне нужно array_merge эти два, но когда я это сделаю (в отладке):
Array ( [none] => N/A [0] => test [1] => test1 )
попробуйте использовать:
$ finalArray = $ options + $ option .see http://codepad.org/BJ0HVtac Просто проверьте поведение для дубликатов ключей, я не тестировал это. Для уникальных клавиш он отлично работает.
<?php $options = array ( "1567" => "test", "1853" => "test1", ); $option = array ( "none" => "N/A" ); $final = array_merge($option,$options); var_dump($final); $finalNew = $option + $options ; var_dump($finalNew); ?>
Просто используйте $options + $option
!
var_dump($options + $option);
выходы:
array(3) { [1567]=> string(4) "test" [1853]=> string(5) "test1" ["none"]=> string(3) "N/A" }
Но будьте осторожны, когда происходит ключевое столкновение. Вот что написано в руководстве по PHP :
Клавиши из первого массива будут сохранены. Если в обоих массивах существует ключ массива, тогда будет использоваться элемент из первого массива, и элемент совпадающего ключа из второго массива будет проигнорирован.
Я пытался объединить два ассоциативных массива вместе, добавляя значения вместе, если ключи были одинаковыми. Если бы были уникальные ключи для любого массива, они бы были добавлены в объединенный массив с их существующими значениями.
Я не мог найти функцию для этого, поэтому сделал следующее:
function array_merge_assoc($array1, $array2) { if(sizeof($array1)>sizeof($array2)) { echo $size = sizeof($array1); } else { $a = $array1; $array1 = $array2; $array2 = $a; echo $size = sizeof($array1); } $keys2 = array_keys($array2); for($i = 0;$i<$size;$i++) { $array1[$keys2[$i]] = $array1[$keys2[$i]] + $array2[$keys2[$i]]; } $array1 = array_filter($array1); return $array1; }
Ссылка: http://www.php.net/manual/en/function.array-merge.php#90136
$final_option = $option + $options;
когда array_merge
не работает, просто выполните
<?php $new = array(); foreach ($options as $key=>$value) $new[$key] = $value; foreach ($option as $key=>$value) $new[$key] = $value; ?>
или переключить две линии foreach
зависимости от того, какой массив имеет более высокий приоритет
Этот код может использоваться для рекурсивного слияния:
function merge($arr1, $arr2){ $out = array(); foreach($arr1 as $key => $val1){ if(isset($arr2[$key])){ if(is_array($arr1[$key]) && is_array($arr2[$key])){ $out[$key]= merge($arr1[$key], $arr2[$key]); }else{ $out[$key]= array($arr1[$key], $arr2[$key]); } unset($arr2[$key]); }else{ $out[$key] = $arr1[$key]; } } return $out + $arr2; }
сfunction merge($arr1, $arr2){ $out = array(); foreach($arr1 as $key => $val1){ if(isset($arr2[$key])){ if(is_array($arr1[$key]) && is_array($arr2[$key])){ $out[$key]= merge($arr1[$key], $arr2[$key]); }else{ $out[$key]= array($arr1[$key], $arr2[$key]); } unset($arr2[$key]); }else{ $out[$key] = $arr1[$key]; } } return $out + $arr2; }
Если массивы, имеющие одинаковые ключи, используют array_merge_recursive()
$array1 = array( "a" => "1" , "b" => "45" ); $array2 = array( "a" => "23" , "b" => "33" ); $newarray = array_merge_recursive($array1,$array2);
array_merge_recursive()
перезаписывает, он просто делает значение как массив.