2010-07-17 5 views
0

Je reçois un tableau de valeurs de retour à partir d'une base de données où je reçois un tableau avec des valeurs comme ceci:PHP, possible d'avoir plusieurs clés pour une valeur de tableau?

Array ([6712] => 64.79.197.36:43444 [6712] => 64.79.197.36:43444 [6711] => 64.79.194.56:41113 [6710] => 64.21.47.20:8080 [6709]) 

Lorsque les chiffres entre parenthèses, comme [6712] sont le champ « id » dans la base de données .. la question est que dans mon script que je veux faire en sorte que la valeur de chaque tableau a une deuxième clé que je cède, qui part de « 0 » et incréments par un, donc quelque chose comme:

Array ([0][6712] => 64.79.197.36:43444 [1][6712] => 64.79.197.36:43444 [2][6711] => 64.79.194.56:41113 [3][6710] => 64.21.47.20:8080 [4][6709]) 

C'est pour le traitement des données, donc je veux être en mesure de suivre chacun de manière significative dans mon script (Comme je ne peux pas prédire ce que l'ID mysql serait comme il peut y avoir des enregistrements supprimés, etc, donc ce n'est pas toujours incrémenté de 1) ..

J'ai trouvé quelques façons de créer un nouveau tableau en assignant une nouvelle clé mais je me demande s'il est possible d'avoir 2 touches pour 1 valeur de tableau

Répondre

5

C'est parfaitement possible, en utilisant des références.

$result = array (6712 => '64.79.197.36:43444', 
        6711 => '64.79.194.56:41113', 
        6710 => '64.21.47.20:8080' 
       ); 
$i = 0; 
foreach($result as $key => $value) { 
    $result[$i++] = &$result[$key]; 
} 

var_dump($result); 
echo '<br />'; 
$result[0] = '127.0.0.1:80'; 

var_dump($result); 
echo '<br />'; 

mais cela risque de poser problème pour vous.

Le code ci-dessus illustre la définition d'un tableau initial, puis l'allocation d'une deuxième clé pour chacune des trois valeurs du tableau initial. Ensuite, le code modifie une seule entrée dans le tableau, et démontre que la modification est reflétée dans les deux valeurs clés;

EDIT

Avoir les deux clés dans un tableau sera lourd à travailler avec si vous voulez utiliser foreach(), Curr(), et d'autres structures de contrôle des éléments qui manipulent votre position dans le tableau, parce que vous récupérerez chaque entrée deux fois.

Il peut être plus facile de travailler avec deux tableaux, le second étant une série de pointeurs sur le premier.

$result = array (6712 => '64.79.197.36:43444', 
        6711 => '64.79.194.56:41113', 
        6710 => '64.21.47.20:8080' 
       ); 
$wrkResult = array(); 
foreach($result as $key => $value) { 
    $wrkResult[] = &$result[$key]; 
} 

var_dump($result); 
echo '<br />'; 
var_dump($wrkResult); 
echo '<br />'; 
$result[0] = '127.0.0.1:80'; 

var_dump($result); 
echo '<br />'; 
var_dump($wrkResult); 
echo '<br />'; 

Ensuite, vous pouvez travailler en utilisant soit $ result ou wrkResult $, et toute modification des valeurs dans un sera refelected dans l'autre; vous pouvez faire une boucle par l'un ou l'autre et seulement obtenir le nombre exact de résultats, pas deux fois plus, etc.

+0

Merci, bien dans mon cas, la clé initiale est actuall y une variable inconnue par le script comme étant juste donnée par la base de données mysql et n'a pas de point de référence pour l'utiliser, elle est seulement utile pour mettre à jour la base de données après que des modifications ont été apportées à la valeur correspondante utiliser dans le script PHP, donc je ne pense pas que ce serait trop difficile de travailler de cette façon – Rick

+0

Le second est beaucoup mieux (en considérant le futur "foreaching"), pour la cohérence je recommande de stocker tous les identifiants dans le tableau "principal" - alors si vous accédez à n'importe quelle touche, vous pouvez toujours savoir quelles touches accèdent au même :) +1 pour la solution EDIT :) –

+0

Le problème avec l'utilisation du second est que si vous le mettez dans MongoDb alors il n'aura pas les bonnes touches. Par conséquent, j'utilise simplement un caractère spécial dans mes clés sémantiques et si ce n'est pas le cas, je "continue" les boucles foreach. De cette façon, vous n'obtenez pas le problème "deux fois retourné" ... – CommaToast

1

Eh bien, mon PHP est un peu rouillé, mais laissez-moi craquer mes doigts poussiéreux sur celui-ci:

je ferais une fonction de transformation pour cela. Il accepte le premier tableau comme son entrée (celui avec "6712" et autres comme sa clé), et retourne le second tableau comme sa sortie.

Désolé pour et toutes les erreurs de syntaxe, mais ici il va:

function indexer ($array) { 
    $result = array(); 
    $i = 0; 
    foreach ($array as $key => $value) { 
    $result[$i][$key] = $value; 
    $i++; 
    } 
    return $result; 
} 

Mais! Si vous n'avez pas strictement besoin du tableau à deux dimensions, vous pouvez itérer sur un tableau sans toute cette surcharge. Voir les fonctions reset(), next() et prev(). Dans le cas où vous êtes intéressé par la clé (que vous êtes probablement, dans votre cas), voir aussi la fonction each(). N'oubliez pas que chaque tableau possède un pointeur interne avec état. Cela signifie que si vous passez beaucoup le tableau, l'état du pointeur sera mémorisé. Alors appelez le reset() de manière appropriée.

+0

Merci d'avoir pris le temps de l'écrire .. Je vais essayer .. en fait le prochain(), prev() devrait fonctionner pour la plupart des choses dont j'ai besoin pour ça, mais ça a juste attiré ma curiosité (en attribuant un 2ème identifiant) pour savoir si je peux le faire car je pense que ce sera nécessaire pour certaines des choses plus complexes que j'essaie de faire – Rick

0
$keys = array_keys($array); 
$values = array_values($array); 

$easyArray = array(); 

foreach($keys as $keyId => $key) { 
    $easyArray[$keyId] = array(
     'id'  => $key, 
     'addr' => $values[$keyId] 
    ); 
} 

Ensuite, vous avez un choix facile à travailler, indexé de 0 à nombre de rangées - 1, avec le nombre correct de dimensions:

// get the id of element $i: 
$easyArray[$i]['id'] 

// get the address of element $i 
$easyArray[$i]['addr'] 
Questions connexes