2009-12-10 5 views
1

Le truc c'est que je dois créer une matrice 2D en php où chaque ligne et colonne doit avoir une clé. J'ai essayé de le faire mais ce qui se passe est qu'un tableau à deux dimensions est créé qui ne ressemble pas à une matrice. J'ai utilisé le code suivant:Créer une matrice 2-D en php

$x=$row['start_id'];
$y=$row['dest_id'];
$d=$row['distance'];
$this->map[$x][$y]=$d;

Voici la carte est la matrice prévue. L'intention de ce code est de créer une matrice d'adjacence, puis de remplir les cellules non définies avec la distance maximale. $ x, $ y et $ d dans le code ci-dessus sont dérivés du résultat d'une requête mysql.

Exemple de sortie:

Array (
    [10010012] => Array ( 
     [10010013] => 2 
     [10010016] => 8 
    ) 
    [10010016] => Array ( 
     [10010015] => 5 
    ) 
    [10010013] => Array ( 
     [10010014] => 7 
     [10010016] => 3 
    ) 
    [10010014] => Array ( 
     [10010015] => 2 
    ) 
) 

Maintenant, le problème est que je ne suis pas en mesure de remplir les cellules vides
par exemple touche de ligne => [10010012] et touche de colonne => [10010015] (impossible de définir la valeur)

Toute aide est appréciée. Si possible, mentionnez également comment traverser ces matrices. Je suis un débutant relatif et j'ai fait de mon mieux pour expliquer mon problème. Cependant, si vous trouvez des lacunes, veuillez les signaler.

Éditer: La matrice n'est pas une matrice.

+0

"Pas en mesure"? Quel est exactement le message d'erreur ou ce qui ne fonctionne pas? – Franz

+0

Ce n'est pas un message d'erreur. Je crée une matrice en utilisant un tableau associatif de la mauvaise manière. Il semble y avoir un problème dans la logique. – 5lackp1x3l0x17

Répondre

5

Ce serait

$this->map[10010012][10010015]= MAX_DISTANCE; 

D'autre part, pourquoi voulez-vous mettre tous vides/cellule non-existante à MAX_DISTANCE? Vous pouvez laisser la carte incomplète et chaque fois qu'une cellule n'existe pas vous assumez MAX_DISTANCE comme valeur.

modifier: exemple simple

define('MAX_DISTANCE', PHP_INT_MAX); 

$map = array(
    10010012 => array (10010013 => 2, 10010016 => 8), 
    10010016 => array (10010015 => 5), 
    10010013 => array (10010014 => 7, 10010016 => 3), 
    10010014 => array (10010015 => 2) 
); 

function getValue(&$map, $x, $y) { 
    return isset($map[$x][$y]) ? $map[$x][$y] : MAX_DISTANCE; 
} 

function setValue(&$map, $x, $y, $value) { 
    if (!isset($map[$x])) { 
    $map[$x] = array($y => $value); 
    } 
    else { 
    $map[$x][$y] = $value; 
    } 
} 

// get an "existing" value from $map 
echo getValue($map, 10010012, 10010016), "\n"; 
// get a "non-existing" value from $map 
echo getValue($map, 10010014, 10010016), "\n"; 

// set a "new" value 
setValue($map, 10010014, 10010016, 5); 
// $map has been altered 
var_dump($map[10010014]); 

impressions

8 
2147483647 
array(2) { 
    [10010015]=> 
    int(2) 
    [10010016]=> 
    int(5) 
} 
+0

Je ne peux pas ajouter manuellement max_distance à chaque cellule. Il est supposé être automatique en utilisant une boucle foreach qui définira max_distance chaque fois qu'il trouve une cellule non définie. – 5lackp1x3l0x17

+0

Mais pourquoi définir MAX_DISTANCE de toute façon? Pourquoi ne pas considérer "pas du tout égal à MAX_DISTANCE" comme indiqué dans l'exemple? La seconde getValue(), c'est-à-dire 'getValue ($ map, 10010014, 10010016)' renvoie MAX_DISTANCE car il n'y a pas de $ map [10010014] [10010016] (encore). Veuillez expliquer pourquoi cela n'est pas suffisant. – VolkerK

+0

Vous n'avez pas vu votre modification. Maintenant, je comprends ce que vous voulez dire. Je vais essayer de mettre en œuvre votre solution et de revenir vers vous. – 5lackp1x3l0x17

Questions connexes