2009-11-30 7 views
0

J'ai des paires d'éléments dans un tableau PHP. Exemple:Combiner des paires à des groupes [PHP/Arrays]

<?php 
$elements = array(
    'tiger'=>'lion', 
    'car'=>'bike', 
    'lion'=>'zoo', 
    'truck'=>'plane' 
); 
?> 

Maintenant, je veux combiner ces éléments de sorte que tous les éléments qui sont connectés d'une manière ou d'une autre vont à un groupe. Poursuite de l'exemple ci-dessus:

<?php 
$groups = array(
    0=>array('tiger', 'lion', 'zoo'), 
    1=>array('car', 'bike'), 
    2=>array('truck', 'plane' 
); 
?> 

Est-ce compréhensible? Comment pourrais-je y parvenir?

Je suis à la recherche d'une fonction qui fait cela.

Répondre

3
<?php 

$elements = array(
    'tiger' => 'lion', 
    'car' => 'bike', 
    'lion' => 'zoo', 
    'truck' => 'plane' 
); 

$groups = array(); 

foreach ($elements as $key => $val) { 
    $appended = false; 
    foreach ($groups as &$group) { 
     if ($group[0] == $key) { 
      array_unshift($group, $val); 
      $appended = true; 
      break; 
     } 
    } 
    if (!$appended) { 
     $groups[] = array($val, $key); 
    } 
} 

var_dump($groups); 

donne:

array(3) { 
    [0]=> 
    array(3) { 
    [0]=> 
    string(3) "zoo" 
    [1]=> 
    string(4) "lion" 
    [2]=> 
    string(5) "tiger" 
    } 
    [1]=> 
    &array(2) { 
    [0]=> 
    string(4) "bike" 
    [1]=> 
    string(3) "car" 
    } 
    [2]=> 
    array(2) { 
    [0]=> 
    string(5) "plane" 
    [1]=> 
    string(5) "truck" 
    } 
} 
+0

Vos sous-réseaux sont tous dans l'ordre inverse, je ne sais pas si cela questions cependant. –

+0

Merci beaucoup, la commande n'a pas d'importance. :) – caw

0

L'idée est simple:

  1. Créer un nouveau tableau pour tenir vos groupes
  2. Boucle sur le tableau de l'article
  3. Vérifiez si le groupe de l'élément existe dans le tableau de groupe - si elle ne pas, créez
  4. article Put dans le groupe
2

Voici un O (n) solution:

$elements = array(
    'tiger' => 'lion', 
    'car' => 'bike', 
    'lion' => 'zoo', 
    'truck' => 'plane' 
); 
$groups = array(); 
$sub = array(); 
$ignore = array(); 

foreach ($elements as $key=>$value) { 
    if (isset($ignore[$key])) { 
     continue; 
    } 

    $sub = array($key, $value); 

    if (isset($elements[$value])) { 
     $ignore[$value] = 1; 
     $sub[]   = $elements[$value]; 
    } 

    $groups[] = $sub; 
} 

print_r($groups); 

Résultat:

Array 
(
    [0] => Array 
     (
      [0] => tiger 
      [1] => lion 
      [2] => zoo 
     ) 

    [1] => Array 
     (
      [0] => car 
      [1] => bike 
     ) 

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

) 
+0

Merci beaucoup, la commande n'a pas d'importance. :) – caw