2009-09-18 12 views
2

J'ai un tableau d'entiers en deux dimensions. Je souhaite l'initialiser dans l'ordre des colonnes, puis y accéder dans l'ordre des lignes. Est-il possible de s'initialiser en PHP dans l'ordre des colonnes sans itération explicite sur chaque ligne?accès par colonne avec tableau multidimensionnel en php

Par exemple, dans R, on peut faire

my2d = matrix(nrow=2, ncol=2) # create 2x2 matrix 
my2d[,1] = c("a","c") # initialize column 1 in a single statement 
my2d[,2] = c("b","d") # initialize column 2 in a single statement 
print(my2d[1,])  # returns "a" "b" 
print(my2d[2,])  # returns "c" "d" 

Répondre

0

Malheureusement, non. Un tableau 2-D d'entiers dans PHP est en fait configuré comme un tableau de lignes, chaque ligne étant un tableau de colonnes. Vous pouvez, en théorie faire quelque chose comme:

 
$data[0][1]; 
$data[1][1]; 

mais qui est vraiment juste itérer. Il semble (et j'ai très peu de connaissances sur R, donc excusez-moi si je me trompe) que la mise en œuvre d'une matrice par R soit un tableau réel, fidèle à la forme, multidimensionnel. Ils ne sont vraiment pas compatibles.

+0

Cela confirme mon impression, aussi. J'avais espéré avoir tort! –

0

Qu'en est-il quelque chose comme ceci:

$tab = array(
    array('a', 'b'), // first line 
    array('c', 'd'), // second line 
); 
var_dump($tab); 

Ce qui vous donne:

array 
    0 => 
    array 
     0 => string 'a' (length=1) 
     1 => string 'b' (length=1) 
    1 => 
    array 
     0 => string 'c' (length=1) 
     1 => string 'd' (length=1) 

Une seule instruction, et aucune itération ;-)

Il est déclaré dans son ensemble, et non vraiment "colonne par colonne",; on pourrait dire qu'il est déclaré ligne par ligne, et non colonne par colonne - ce qui n'est pas tout à fait possible en PHP ... Mais cela semble répondre à vos besoins?

+0

Ceci est l'initialisation dans l'ordre des lignes, ce qui est exactement ce que j'essaie d'éviter. :) –

0

Je vous suggère d'entrer les données dans l'ordre des lignes et d'écrire une fonction pour lire les "colonnes" comme vous en avez besoin.

function col($arr, $offs) { 
    $t = array(); 

    foreach($arr as $row) 
     $t[]= $row[$offs]; 

    return $t; 
} 

$my2d = array(); 
$my2d[]= array("a", "c"); 
$my2d[]= array("b", "d"); 
print(col($my2d,0));  // returns array("a","b") 
print(col($my2d,1));  // returns array("c","d") 

Edit: Si vous voulez être pédant, vous pouvez écrire la fonction pour entrer vos données dans l'ordre des colonnes, puis le lire hors de l'ordre des lignes; cela ne fait pas de réelle différence, sauf qu'il va visser vos données si vous variez le nombre d'éléments de données dans une colonne.

Dans tous les cas, la réponse est: Non, quelque part, vous devrez itérer.

+0

C'est le contraire de ce que je cherche, à savoir l'initialisation dans l'ordre des colonnes et la lecture des rangs. –

0

Avez-vous pensé à utiliser array_map()? Par exemple.

$my2d = array_map(function($row,$col) { 
      $row[1]=$col;return $row; 
     }, $my2d, array('a','c')); 

Il est une itération, mais bien caché;)