Combina coppie a gruppi [PHP / Array]
Domanda
Ho coppie di elementi in un array PHP. Esempio:
<?php
$elements = array(
'tiger'=>'lion',
'car'=>'bike',
'lion'=>'zoo',
'truck'=>'plane'
);
?>
Ora voglio combinare questi elementi in modo che tutti gli elementi collegati in qualche modo vadano a un gruppo. Continuazione dell'esempio precedente:
<?php
$groups = array(
0=>array('tiger', 'lion', 'zoo'),
1=>array('car', 'bike'),
2=>array('truck', 'plane'
);
?>
È comprensibile? Come ho potuto raggiungere questo obiettivo?
Sto cercando una funzione che faccia questo.
Soluzione
<?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);
si ottiene:
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"
}
}
Altri suggerimenti
Ecco una soluzione O (n):
$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);
Risultato:
Array
(
[0] => Array
(
[0] => tiger
[1] => lion
[2] => zoo
)
[1] => Array
(
[0] => car
[1] => bike
)
[2] => Array
(
[0] => truck
[1] => plane
)
)
L'idea è semplice:
- Crea un nuovo array per contenere i tuoi gruppi
- Passa sopra l'array di elementi
- Controlla se il gruppo per l'elemento esiste nell'array del gruppo - in caso contrario, crealo
- Metti l'elemento nel gruppo
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow