Установить Теорию Союза массивов в PHP

В математике есть 3 операции с множествами: пересечение, разность и объединение (объединение). В PHP мы можем выполнять эти операции с массивами:

  • пересечение: array_intersect
  • разница: array_diff

Что такое функция for union?

В массиве результатов не должно быть дубликатов (например, array_intersect и array_diff).

Если индексы являются числовыми, то array_merge не будет перезаписывать исходное значение, но будет добавляться ( PHP docs ).

30
задан 27.11.2016, 11:54

9 ответов

Попробуйте array_merge:

array_unique(array_merge($array1, $array2));

Руководство по PHP

54
ответ дан 11.10.2019, 15:52
  • 1
    +1 для array_unique – Sebastian 30.05.2013, 01:19
  • 2
    Я don' t понимают, почему это принято и upvoted больше, чем ответы, указывающие на оператор объединения (+). Я пропускаю что-то об операторе объединения? – mwotton 27.11.2013, 05:50
  • 3
    PHP' s " объединение operator" не выполняет математическое объединение. var_dump ([1,2] + [3,4]) имеет математическое объединение [1,2,3,4] (из-за 4 значений), но два массива только имеют два уникальных ключа, поэтому сценарий произведет [1,2]. PHP' s " union" оператор полностью не связан с математическим объединением – Josh Ribakoff 25.03.2014, 00:44
  • 4
    Вы могли возможно уточнить больше аспект UI? Приложение в настоящее время не имеет GUI, но it' s в моем списке " to-do-after-everything-else-is-done" объекты. – Mark 01.10.2019, 07:22

В ответе Адриена нет необходимости создавать последовательно пронумерованный массив из двух последовательно пронумерованных массивов - вот несколько вариантов, которые будут:

array_values(array_unique(array_merge($array1, $array2)));

(ответ Адриена с нумерацией ключей впоследствии)

array_keys(array_flip($array1)+array_flip($array2))

(Поместите значения в ключи и используйте оператор объединения массивов)

array_merge($array1, array_diff($array2, $array1))

(Удалите общие значения из второго массива перед объединением)

Результаты тестов (для объединение двух массивов длиной 1000 в моей системе тысячу раз):

  • Уникальный (версия Адриена): 2.862163066864 секунды
  • Значения_Уникальный: 3,12 секунды
  • Keys_Flip: 2,34 секунд
  • Merge_Diff: 2,64 секунды

Тот же тест, но с двумя очень похожими массивами (по крайней мере, 80% дублируются):

  • Уникальный ( Версия Адриена): 2,92 секунды
  • Значения_Уникация: 3,15 секунды
  • Keys_Flip: 1,84 секунды
  • Merge_Diff: 2,36 секунды

Кажется, используя массив оператор союза, чтобы сделать ctual union - самый быстрый метод. Однако обратите внимание, что array_flip безопасен, только если значения массива - это все строки или все целые числа; если вам нужно произвести объединение массива объектов, я рекомендую версию с array_merge и array_diff.

8
ответ дан 11.10.2019, 15:52
  • 1
    Другими вещами, о которых необходимо читать, являются мертвые блокировки, наследование приоритета и условия состязания. – Mike DeSimone 01.10.2019, 07:21

array_unique( array_merge( ... ) )

11
ответ дан 11.10.2019, 15:52
  • 1
    There' s не очень к нему. Просто те платформы UI являются вообще однопоточными до такой степени, что только одному потоку даже позволяют взаимодействовать с UI. Доступ к любой части UI от другого потока является ошибкой. – jalf 01.10.2019, 07:21

Используйте array_unique и array_merge вместе.

5
ответ дан 11.10.2019, 15:52
  • 1
    Способ ввести в заблуждение OP. volatile имеет ничто , чтобы сделать с многопоточностью. Это не предназначается для многопоточности, и это не имеет никаких свойств, относящихся к многопоточности. – jalf 01.10.2019, 07:33

используйте оператор «+» для этого. Смотрите ссылку Array Operators

4
ответ дан 11.10.2019, 15:52
  • 1
    Jinja2 также присвоит крыло стиля расширенного кортежа {% set list1,list2 = variable1.split(';') %}. – Dave 12.04.2016, 06:54
$result = array_merge_recursive($first, $second);

может быть полезно, когда у вас есть массивы с массивами внутри.

1
ответ дан 11.10.2019, 15:52
  • 1
    @AbhishekAgrawal значение, которое передается в шаблон, является точкой с запятой, разделил строку. – user3605780 08.06.2017, 22:29

Из кода в документации PHP: Операторы массивов :

<?php
$a = array("a" => "apple", "b" => "banana");
$b = array("a" => "pear", "b" => "strawberry", "c" => "cherry");

$c = $a + $b; // Union of $a and $b
echo "Union of \$a and \$b: \n";
var_dump($c);

$c = $b + $a; // Union of $b and $a
echo "Union of \$b and \$a: \n";
var_dump($c);
?>

При выполнении этот скрипт выведет следующее:

Union of $a and $b:
array(3) {
  ["a"]=>
  string(5) "apple"
  ["b"]=>
  string(6) "banana"
  ["c"]=>
  string(6) "cherry"
}
Union of $b and $a:
array(3) {
  ["a"]=>
  string(4) "pear"
  ["b"]=>
  string(10) "strawberry"
  ["c"]=>
  string(6) "cherry"
}
4
ответ дан 11.10.2019, 15:52
  • 1
    Действительно ли это - список или набор? Поскольку в наборе, это будет следовать за свойствами набора а не списка. – as2d3 08.06.2017, 22:18

Оператор +:

$x[0] = 4;
$x[1] = 1;

$y[0] = 9;
$y[2] = 5;

$u = $y + $x;

// Results in:
$u[0] === 9;
$u[1] === 1;
$u[2] === 5;

Обратите внимание, что $x + $y! = $y + $x

0
ответ дан 11.10.2019, 15:52
  • 1
    Да, но мы создали list1, тогда является ли это списком или набором? – as2d3 08.06.2017, 22:33

Просто используйте $array1 + $array2 Это приведет к объединению обоих массивов.

0
ответ дан 11.10.2019, 15:52
  • 1
    @AbhishekAgrawal я думаю функция разделения, создает список. ' set' от установки переменной не набор данных. Но I' m не уверенный, если это - список или набор, но можно просто добраться до данных с {{list1 [0]}}. – user3605780 08.06.2017, 22:46

Теги

Похожие вопросы