2014-10-24 4 views
1

У меня есть массив на входе с идентификаторами графических элементов, и мне нужно найти их группы. Я пытался использовать 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

Как вы определяющие группы? Я мог бы предположить, что вам нужны группы из 3, но тогда почему первая группа в вашем примере имеет только 2? – jiy

+0

Группы - это массив, содержащий объединенные массивы братьев и сестер. Если одно из значений из массива сиблингов присутствует в другом массиве, эти массивы должны быть объединены. –

+0

А, я понимаю, что вы имеете в виду сейчас. Спасибо за разъяснения. – jiy

ответ

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) } } } 
+0

с использованием 'array_pop' может быть лучше, чем' array_shift' в этом случае. Идея состоит в том, чтобы получить и удалить каждый элемент из '$ round'. Однако порядок выходных элементов изменится (хотя я думаю, что это не имеет значения). –

+1

Спасибо, это помогло. –

+0

@ user3173246 приятно знать, что если это поможет, пожалуйста, примите ответ (нажав на серое галочку). Я знаю, что вы новичок в SO. –

0

Возможно, что-то вроде этого будет работать. Он не сравнивает братьев и сестер друг с другом. Вместо этого он сглаживает массив, удаляет дубликаты, а затем разбивает его на группы 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 
     ) 

) 
Смежные вопросы