Вопрос

В 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.

Это было полезно?

Решение

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

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

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

Другие советы

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

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

/**
 * 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);
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top