Array_merge & array_unique

Есть ли функция массива в PHP, которая каким-то образом делает array_merge, сравнивая значения , игнорируя ключи? Я думаю, что array_unique(array_merge($a, $b)) работает, однако я считаю, что должен быть более хороший способ сделать это.

например.

$a = array(0 => 0, 1 => 1, 2 => 2);
$b = array(0 => 2, 1 => 3, 2 => 4);

в результате:

$ab = array(0 => 0, 1 => 1, 2 => 2, 3 => 3, 4 => 4);

Обратите внимание, что меня не интересуют ключи в $ab, однако было бы неплохо, если бы они были восходящими, начиная с 0 до count($ab)-1.

5 ответов

function umerge($arrays){
 $result = array();
 foreach($arrays as $array){
 $array = (array) $array;
 foreach($array as $value){
 if(array_search($value,$result)===false)$result[]=$value;
 }
 }
 return $result;
}


Самое элегантное, простое и эффективное решение - это тот, который упоминается в первоначальном вопросе...

$ab = array_unique(array_merge($a, $b));

Этот ответ также упоминался ранее в комментариях Бена Ли и двойника, но я размещаю его здесь как реальный ответ на благо других людей, которые находят этот вопрос и хотят знать, что самое лучшее решение, не читая все комментарии на этой странице.


Чтобы ответить на заданный вопрос, для общего решения, которое также работает с ассоциативными массивами при сохранении ключей, я считаю, что вы найдете это решение наиболее удовлетворительным:

/**
 * array_merge_unique - return an array of unique values,
 * composed of merging one or more argument array(s).
 *
 * As with array_merge, later keys overwrite earlier keys.
 * Unlike array_merge, however, this rule applies equally to
 * numeric keys, but does not necessarily preserve the original
 * numeric keys.
 */
function array_merge_unique(array $array1 /* [, array $...] */) {
 $result = array_flip(array_flip($array1));
 foreach (array_slice(func_get_args(),1) as $arg) { 
 $result = 
 array_flip(
 array_flip(
 array_merge($result,$arg)));
 } 
 return $result;
}


array_merge будет игнорировать числовые клавиши, поэтому в вашем примере array_merge($a, $b) даст вам $ab, нет необходимости вызывать array_unique().

если у вас есть строковые ключи (т.е. ассоциативный массив), сначала используйте array_values():

array_merge(array_values($a), array_values($b));


$a = array(0 => 0, 1 => 1, 2 => 2);
$b = array(0 => 2, 1 => 3, 2 => 4);
//add any from b to a that do not exist in a
foreach($b as $item){
 if(!in_array($item,$b)){
 $a[] = $item
 }
}
//sort the array
sort($a);

licensed under cc by-sa 3.0 with attribution.