85 votes

La transposition de tableaux multidimensionnels en PHP

Comment voulez-vous flip 90 degrés (transpose) un tableau multidimensionnel en PHP? Par exemple:

// Start with this array
$foo = array(
    'a' => array(
       1 => 'a1',
       2 => 'a2',
       3 => 'a3' 
    ),
    'b' => array(
       1 => 'b1',
       2 => 'b2',
       3 => 'b3' 
    ),
    'c' => array(
       1 => 'c1',
       2 => 'c2',
       3 => 'c3' 
    )
);

$bar = flipDiagonally($foo); // Mystery function
var_dump($bar[2]);

// Desired output:
array(3) {
  ["a"]=>
  string(2) "a2"
  ["b"]=>
  string(2) "b2"
  ["c"]=>
  string(2) "c2"
}

Comment voulez-vous mettre en oeuvre flipDiagonally()?

Edit: ce n'est pas de devoirs. Je veux juste voir si tout SOers ont plus de solution créative que le chemin le plus évident. Mais depuis quelques gens se sont plaints de ce problème étant trop facile, ce qui sur un plan plus général solution qui fonctionne avec un nième dimension de tableau?

c'est à dire Comment voulez-vous écrire une fonction de sorte que:

$foo[j][k][...][x][y][z] = $bar[z][k][...][x][y][j]

?(ps. Je ne pense pas que 12 imbriquée for loops est la meilleure solution dans ce cas.)

266voto

Codler Points 4395
function transpose($array) {
    array_unshift($array, null);
    return call_user_func_array('array_map', $array);
}

81voto

OIS Points 5566

Avec 2 boucles.

function flipDiagonally($arr) {
    $out = array();
    foreach ($arr as $key => $subarr) {
    	foreach ($subarr as $subkey => $subvalue) {
    		$out[$subkey][$key] = $subvalue;
    	}
    }
    return $out;
}

9voto

Aziz Points 7500

Je pense que vous faites référence à la matrice de transposition (colonnes deviennent les lignes, les lignes deviennent des colonnes).

Voici une fonction qui le fait pour vous (source):

function array_transpose($array, $selectKey = false) {
    if (!is_array($array)) return false;
    $return = array();
    foreach($array as $key => $value) {
        if (!is_array($value)) return $array;
        if ($selectKey) {
            if (isset($value[$selectKey])) $return[] = $value[$selectKey];
        } else {
            foreach ($value as $key2 => $value2) {
                $return[$key2][$key] = $value2;
            }
        }
    }
    return $return;
}

4voto

v3. Points 1370

La transposition d'un N-dimensions tableau:

function transpose($array, &$out, $indices = array())
{
    if (is_array($array))
    {
    	foreach ($array as $key => $val)
    	{
    		//push onto the stack of indices
    		$temp = $indices;
    		$temp[] = $key;
    		transpose($val, $out, $temp);
    	}
    }
    else
    {
    	//go through the stack in reverse - make the new array
    	$ref = &$out;
    	foreach (array_reverse($indices) as $idx)
    		$ref = &$ref[$idx];
    	$ref = $array;
    }
}

$foo[1][2][3][3][3] = 'a';
$foo[4][5][6][5][5] = 'b';

$out = array();
transpose($foo, $out);

echo $out[3][3][3][2][1] . ' ' . $out[5][5][6][5][4];

Vraiment hackish, et probablement pas la meilleure solution, mais bon, il fonctionne.

Fondamentalement, il parcourt le tableau de manière récursive, en accumulant les actuels indicies dans un tableau.
Une fois qu'il obtient à la valeur de référence, il faut de la "pile" des indices et à l'inverse, de les mettre dans la $tableau. (Est-il un moyen d'éviter l'utilisation de l' $temp tableau?)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X