Trouver un produit cartésien tout en préservant les clés dans des tableaux associatifs
Considérons un tableau associatif comme le suivant :
$input = array( 'arm' => array('A', 'B', 'C'), 'gender' => array('Female', 'Male'), 'location' => array('Vancouver', 'Calgary'), );
Le but est de retrouver le produit cartésien de ce tableau tout en préservant les clés associatives d'origine. Le résultat souhaité serait :
array( [0] => array( 'arm' => 'A', 'gender' => 'Female', 'location' => 'Vancouver' ), [1] => array( 'arm' => 'A', 'gender' => 'Female', 'location' => 'Calgary' ), [2] => array( 'arm' => 'A', 'gender' => 'Male', 'location' => 'Vancouver' ), ... )
Justification de l'algorithme
Supposons que le tableau d'entrée ait N sous-tableaux ($input), chacun avec Cn éléments, où n est son indice. Le ième élément du nième sous-tableau est appelé Vn,i.
L'algorithme prouve (en supposant qu'il n'y ait pas de bug) par induction :
En supposant que le résultat contient déjà le produit cartésien du premier N-1 sous-tableaux, il peut être étendu comme suit :
Mise en œuvre du code
function cartesian($input) { $result = array(); while (list($key, $values) = each($input)) { if (empty($values)) { continue; } if (empty($result)) { foreach ($values as $value) { $result[] = array($key => $value); } } else { $append = array(); foreach ($result as &$product) { $product[$key] = array_shift($values); $copy = $product; foreach ($values as $item) { $copy[$key] = $item; $append[] = $copy; } array_unshift($values, $product[$key]); } $result = array_merge($result, $append); } } return $result; }<p><strong>Utilisation</strong></p> <pre class="brush:php;toolbar:false">$output = cartesian($input); print_r($output);
Ce code produira le produit cartésien souhaité tout en préservant les clés associatives d'origine.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!