Объединить массивы с одинаковыми значениями

У меня есть массив ввода с идентификаторами графических элементов, и мне нужно найти их группы. Я пытался использовать array_search и array_marge, но безуспешно.

У меня есть массив братьев и сестер:

'siblings' =>
array (size=6)
0 =>
array (size=2)
0 => int 0
1 => int 1
1 =>
array (size=2)
0 => int 2
1 => int 3
2 =>
array (size=2)
0 => int 3
1 => int 5
3 =>
array (size=2)
0 => int 4
1 => int 6
4 =>
array (size=2)
0 => int 4
1 => int 7
5 =>
array (size=2)
0 => int 6
1 => int 7

Мне нужен вывод, как показано ниже:

'groups' =>
array (size=6)
0 =>
array (size=2)
0 => int 0
1 => int 1
1 =>
array (size=2)
0 => int 2
1 => int 3
2 => int 5
2 =>
array (size=2)
0 => int 4
1 => int 6
2 => int 7

Я могу вывести это следующим образом:

    $groups[] = array_unique(array_merge($siblings[0]));
$groups[] = array_unique(array_merge($siblings[1],$siblings[2]));
$groups[] = array_unique(array_merge($siblings[3],$siblings[4],$siblings[5]));

var_dump($groups); // will output the previous output of groups

Но мне нужна функция, которая будет работать в больших масштабах.

1

Решение

Это может быть не так эффективно, но это работает. Обычная идея — циклически проходить по массиву, проверять пересечение тока с оставшимися внутренними массивами. Если есть пересечение, просто объедините их с текущим, иначе подготовьте следующий набор массивов (для зацикливания и извлечения следующей группы):

$a = array('siblings' =>  array(array(0,1),array(2,3),array(3,5),
array(4,6),array(4,7),array(6,7)));
$g[] = $a["siblings"][0];
$round = array_slice($a["siblings"],1);
$temp = array();
$i = 0;

while(count($round) > 0){
$v = array_shift($round);
if(count(array_intersect($g[$i],$v)) > 0)
$g[$i] = array_unique(array_merge($g[$i],$v));
else $temp[] = $v;
if(count($round) == 0 && count($temp) > 0) {
$g[] = $temp[0];
$i++;
$round = array_slice($temp,1);
$temp = array();
}
}
$groups["groups"] = $g;
var_dump($groups);

Результат:

array(1) {
["groups"]=> array(3) {
[0]=> array(2) {
[0]=> int(0)
[1]=> int(1) }
[1]=> array(3) {
[0]=> int(2)
[1]=> int(3)
[3]=> int(5) }
[2]=> array(3) {
[0]=> int(4)
[1]=> int(6)
[2]=> int(7) } } }
1

Другие решения

Возможно, что-то подобное будет работать. Это не сравнивает братьев и сестер друг против друга. Вместо этого он выравнивает массив, удаляет дубликаты, а затем разбивает его на группы по 3.

<?php

$siblings = array(
array(0, 1),
array(2, 3),
array(3, 5),
array(4, 6),
array(4, 7),
array(6, 7),
);

$merged = array();
$grouped = array();

for ($i = 0; $i < count($siblings); $i++) {
array_push($merged, $siblings[$i][0]);
array_push($merged, $siblings[$i][1]);
}

$merged = array_unique($merged);
$merged = array_chunk($merged, 3);

print_r($merged);

?>

Дает следующий вывод:

Array
(
[0] => Array
(
[0] => 0
[1] => 1
[2] => 2
)

[1] => Array
(
[0] => 3
[1] => 5
[2] => 4
)

[2] => Array
(
[0] => 6
[1] => 7
)

)
0

По вопросам рекламы [email protected]