¿Cómo devolver las permutaciones de una matriz en PHP?

Tengo una función que toma una matriz unidimensional y devuelve todas las permutaciones posibles de los elementos dentro de la matriz;

function array_2D_permute($items, $perms = array()) { static $permuted_array = array(); if (empty($items)) { $permuted_array[]=$perms; #print_r($new); #print join(' ', $perms) . "\n"; } else { for ($i = count($items) - 1; $i >= 0; --$i) { $newitems = $items; $newperms = $perms; list($foo) = array_splice($newitems, $i, 1); array_unshift($newperms, $foo); array_2D_permute($newitems, $newperms); } return $permuted_array; } } $arr1=array("Architecture","Mexico","Periodicals"); $result1=array_2D_permute($arr1); print_r($result1); $arr2=array("Apple","Boat","Cat"); $result2=array_2D_permute($arr2); print_r($result2); 

La primera vez que se llama a la función, funciona como se esperaba, sin embargo, la segunda vez que se invoca, también incluye elementos de la primera matriz. No puedo entender por qué es esto.

Apreciar la ayuda.

Porque está usando static $permuted_array;

debes usar

 static $permuted_array; // declare static var, if you don't want to use static property of variable, then why are you using this $permuted_array = array(); // set its value to array() 

usando static $permuted_array = array(); no establecerá su valor en array( ) después de la primera iteración

 function array_2D_permute($items, $perms = array(), $isNew = false) { static $permuted_array = array(); if($isNew) $permuted_array = array(); if (empty($items)) { $permuted_array[]=$perms; #print_r($new); #print join(' ', $perms) . "\n"; } else { for ($i = count($items) - 1; $i >= 0; --$i) { $newitems = $items; $newperms = $perms; list($foo) = array_splice($newitems, $i, 1); array_unshift($newperms, $foo); array_2D_permute($newitems, $newperms); } return $permuted_array; } } $arr1=array("Architecture","Mexico","Periodicals"); $result1=array_2D_permute($arr1, array(), true); // print_r($result1); $arr2=array("Apple","Boat","Cat"); $result2=array_2D_permute($arr2, array(), true); /// print_r($result2); 

se agrega un parámetro más $ isNew. Envíe verdadero si desea obtener un resultado para la nueva matriz.

Sé que esta pregunta es antigua, pero aquí hay una solución alternativa que pasa la matriz de devolución por referencia:

 function pc_permute($items, $perms = array( ), &$return = array()) { if (empty($items)) { $return[] = $perms; } 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,$return); } return $return; } } 

versión fija

 protected function array_2D_permute($items, $perms = array(), $reset = true) { static $permuted_array; if ($reset) { $permuted_array = array(); } if (empty($items)) { $permuted_array[] = $perms; } else { for ($i = count($items) - 1; $i >= 0; --$i) { $newitems = $items; $newperms = $perms; list($foo) = array_splice($newitems, $i, 1); array_unshift($newperms, $foo); $this->array_2D_permute($newitems, $newperms, false); } return $permuted_array; } } 

puede usarlo como $ perms = array_2D_permute ($ arr);