La transposition de tableaux multidimensionnels en PHP
Comment tu procèdes à 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 œuvre 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 nème dimension de tableau?
- à-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.)
- vouliez-vous dire $bar[2]?
- Ouais il pro les devoirs depuis son si facile. 🙁
- Ce n'est pas de devoirs. Et tandis que je me considère comme un "newbie" par rapport à beaucoup d'utilisateurs, et je suis parfaitement capable de courir à travers des boucles for imbriquées comme OIS la réponse. J'ai posé cette question dans l'espoir de trouver plus de solution intelligente. Peut-être 1-2 liner à l'aide d'un lamda fonction + array_map, ou un plus obscurs fonction PHP je ne suis pas au courant. Même si la matrice de la manipulation est relativement "basique", il est bon de revisiter les bases de temps en temps. Vous ne savez jamais ce que certains PHP anciens combattants peuvent avoir leurs manches.
- par curiosité, pourquoi n'avez-vous pas accepter Codler de réponse?
Vous devez vous connecter pour publier un commentaire.
Ou si vous utilisez PHP 5.6 ou plus tard:
a
,b
etc
) sont perdues/maintenant numérique. EDIT: je vois @luso déjà mentionné ce problème.var_dump([[1,3],[2,4]] == call_user_func(function ($array) { array_unshift($array, null); return call_user_func_array('array_map', $array); }, [[1,2],[3,4]]));
PHP Warning: array_map(): Argument #6 should be an array in myFile.php on line 10...
- Est-ce une faute de la fonction ou de mon propre code?array_combine(array_keys($array[0]), array_map(null, ...$array))
pour un tableau 2darray_map(null, ...$array);
produit des résultats incorrects lorsque$array
contient 0 ou 1 éléments. Neat peu de code, mauvais usage.Avec 2 boucles.
$test = array(array('a'=>1, 'b'=>2,'c'=>3), array(4,5,6), array(7,8,9));
: il crée un unique élément de tableau pour chaque valeur avec un non-touche numérique. Avec les touches numériques (par exemple,$test = array(array(4,5,6), array(11=>1, 12=>2, 13=>3), array(7,8,9));
), il fait un peu "bizarre". Bien que tous les droits de ce doit, je pense que nous avons besoin d'une meilleure solution!Je pense que vous faites référence à la matrice transposer (colonnes deviennent les lignes, les lignes deviennent des colonnes).
Voici une fonction qui le fait pour vous (source):
La transposition d'un N-dimensions tableau:
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 $hors tableau. (Est-il un moyen d'éviter l'utilisation de l' $temp tableau?)
Je suis confronté au même problème. Voici ce que j'ai trouvé:
J'ai besoin d'une fonction de transposition avec le support pour tableau associatif:
Et le chemin du retour:
La
array_unshift
astuce ne fonctionne pas, NI learray_map
...J'ai donc codé une
array_map_join_array
fonction de traiter avec les clés d'enregistrement de l'association:et
array_transpose
est devenu évident:array_map()
-trick. Merci pour le partage ici!Voici une variante de Codler/Andreas solution qui travaille avec des tableaux associatifs. Un peu plus de temps mais boucle-moins:
Exemple:
Utiliser comme cette
Résultat:
Essayez Comme Ceci
Avant de commencer, je tiens à dire grâce de nouveau à @quazardus pour l'affichage de sa solution universelle pour tranposing deux dimenional associatif (ou non associatif) tableau!
Que je suis dans l'habitude d'écrire mon code comme sèchement que possible, je suis allé à la "réduction" de son code un peu plus loin. Ce sera très probable pas être pour tous les goûts. Mais juste au cas où quelqu'un devrait être intéressés, voici mon point de vue sur sa solution:
Maintenant, analogue à la standard PHP fonction
array_map()
, lorsque vous appelezvous permettra d'obtenir le désiré matrice transposée.
C'est une autre façon de faire exactement la même chose que @codler s réponse ne. J'ai eu pour vider quelques tableaux au format csv j'ai donc utilisé la fonction suivante:
De Test et de sortie de référence: https://tutes.in/how-to-transpose-an-array-in-php-with-irregular-subarray-size/
Ici est array_walk façon d'atteindre cet objectif,
Démo.
Si vous essayez de décompresser l'OP de l'échantillon de données avec le dossier de l'exploitant (
...
), vous allez générer:La preuve
À surmonter cette erreur, appelez
array_values()
à l'index de la première clés au niveau de l'avant de déballer.De sortie:
Une fonctionnalité supplémentaire/surprise concernant la transposition de cette technique est que
null
éléments seront générées lorsque les modules sont de différentes tailles ...mais peut-être pas où vous pourriez vous attendre.À partir de l'échantillon de données comme ceci:
La sortie est:
Avis le niveau de soins présenté par la fonction (comparable à la bagagistes qui porte vos bagages hors du ventre de l'avion). Il n'y a aucune attention à l'origine subarray valeurs de l'id (et ce ne serait pas grave si
1
,2
, &3
ont étéx
,y
, &z
); tout ce qui vient au large de la tapis roulant obtient jeté le plus bas de l'emplacement disponible.Ce comportement est cohérent et fiable dans la prestation d'une matrice complète. Un
foreach()
boucle de remplacement ne sera pas nativement livrernull
élément de sous-tableaux de tailles différentes, et dans la plupart des implémentations de sa capacité à accéder à tous les subarray valeurs dépend de la longueur de la première subarray.De sortie:
Comme indiqué ci-dessus, si vous voulez être sûr que vous avez extrait TOUTES les données du tableau input, vous devriez écrire plus logique de livrer tous les unique de la colonne id de la boucle foreach.
p.s. avant que j'ai appris de cette abréviation de la transposition de la syntaxe, j'ai écrit un plus laid, plus détaillé fonctionnelle transpositeur que attrapé quelques critiques.