Есть ли функция массива в 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
.
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_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);