Občas (např. při luštění šifer) potřebuji pracovat s permutacemi. K tomu lze přistoupit dvěma způsoby – buď si pokaždé napsat funkci, která bude s permutací přímo pracovat tak, jak je potřeba, nebo napsat funkci, která vygeneruje všechny permutace, se kterými budeme pracovat až mimo ni. Druhý způsob je jistě univerzálnější:
<?php /** Vygenerování permutací * @param array pole z prvky, ze kterých se má permutace vytvořit, např. range(1, 2) * @return array pole všech permutací, např. array(array(1, 2), array(2, 1)) * @copyright Jakub Vrána, http://php.vrana.cz/ */ function permutace($prvky) { if (count($prvky) == 1) { return array($prvky); } $return = array(); foreach ($prvky as $prvek) { foreach (permutace(array_diff($prvky, array($prvek))) as $zbytek) { $return[] = array_merge(array($prvek), $zbytek); } } return $return; } // použití foreach (permutace(range(1, 3)) as $permutace) { echo implode(", ", $permutace) . "\n"; } ?>
Pro vyřazení prvku z pole se používá funkce array_diff, která prvek musí v poli znovu vyhledat. Rychlejší by nejspíš bylo použít funkci array_splice, která prvek vyjme přímo podle jeho pozice, ale bylo by s tím o něco víc práce.