Maison > développement back-end > tutoriel php > Comment générer toutes les permutations d'un tableau PHP ?

Comment générer toutes les permutations d'un tableau PHP ?

Linda Hamilton
Libérer: 2024-12-18 17:27:11
original
929 Les gens l'ont consulté

How to Generate All Permutations of a PHP Array?

Générer toutes les permutations d'un tableau PHP

Problème :

Étant donné un tableau de chaînes , générer toutes les permutations possibles de ses éléments. Par exemple, pour le tableau ['peter', 'paul', 'mary'], nous devrions obtenir :

  • peter-paul-mary
  • peter-mary-paul
  • paul-peter-mary
  • paul-mary-peter
  • mary-peter-paul
  • mary-paul-peter

Solution 1 : Fonction pc_permute

Cette fonction utilise la récursion pour échanger et réorganiser les éléments dans le tableau, générant ainsi des permutations.

function pc_permute($items, $perms = array()) {
    if (empty($items)) { 
        echo join(' ', $perms) . "<br />";
    } else {
        for ($i = count($items) - 1; $i >= 0; --$i) {
             $newitems = $items;
             $newperms = $perms;
             list($foo) = array_splice($newitems, $i, 1);
             array_unshift($newperms, $foo);
             pc_permute($newitems, $newperms);
         }
    }
}
Copier après la connexion

Solution 2 : Fonction pc_next_permutation

Une approche alternative consiste à utiliser la permutation suivante algorithme.

function pc_next_permutation($p, $size) {
    // Find the largest index i where p[i] < p[i+1]
    for ($i = $size - 1; $p[$i] >= $p[$i+1]; --$i) { }

    // If i is -1, no next permutation exists
    if ($i == -1) { return false; }

    // Find the largest index j where p[j] > p[i]
    for ($j = $size; $p[$j] <= $p[$i]; --$j) { }

    // Swap p[i] and p[j]
    $tmp = $p[$i]; $p[$i] = $p[$j]; $p[$j] = $tmp;

    // Reverse the order of the elements from i+1 to size
    for (++$i, $j = $size; $i < $j; ++$i, --$j) {
         $tmp = $p[$i]; $p[$i] = $p[$j]; $p[$j] = $tmp;
    }

    return $p;
}
Copier après la connexion

Utilisation :

$arr = array('peter', 'paul', 'mary');

pc_permute($arr);

or

$set = split(' ', 'she sells seashells');
$size = count($set) - 1;
$perm = range(0, $size);
$j = 0;

do { 
     foreach ($perm as $i) { $perms[$j][] = $set[$i]; }
} while ($perm = pc_next_permutation($perm, $size) and ++$j);

foreach ($perms as $p) {
    print join(' ', $p) . "\n";
}
Copier après la connexion

Référence :

  • http://docstore .mik.ua/orelly/webprog/pcook/ch04_26.htm

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!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal