2017-01-20 1 views
0

Je reçois msg_data de requête MySQL avec ORDER BY msg_time clause. J'utilise ensuite utiliser la boucle foreach pour créer un objet JS d'objets comme celui-ci:Pourquoi l'objet JS se trie-t-il toujours par clé?

<script type="text/javascript"> 
    var active_swaps = { 
    <?php if (is_array($msg_data) || $msg_data instanceof Traversable):?> 
     <?php foreach($msg_data as $msg_item):?> 
      <?php echo $msg_item['id'];?> : <?php echo json_encode($msg_item);?>, 
     <?php endforeach;?> 
    <?php endif;?> 
    }; 
</script> 

si je vérifie $msg_data avec var_dump je reçois:

array (size=3) 
    0 => 
    array (size=20) 
     'id' => string '5' (length=1) 
     'user1_id' => string '1' (length=1) 
     'user2_id' => string '2' (length=1) 
     'hasto' => string '2' (length=1) 
     'requested' => string '2017-01-20 14:28:00' (length=19) 
     'accepted' => null 
     'swapped1' => null 
     'swapped2' => null 
     'rejected' => null 
     'rejected_by' => null 
     'swap_seen' => null 
     'msg_id' => string '23' (length=2) 
     'sender_id' => string '1' (length=1) 
     'msg' => string 'awdwadwd' (length=8) 
     'msg_time' => string '2017-01-20 15:58:06' (length=19) 
     'swap_id' => string '5' (length=1) 
     'seen' => null 
     'user1username' => string 'user1' (length=5) 
     'user2username' => string 'user2' (length=5) 
     'online' => string 'false' (length=5) 
    1 => 
    array (size=20) 
     'id' => string '7' (length=1) 
     'user1_id' => string '1' (length=1) 
     'user2_id' => string '2' (length=1) 
     'hasto' => string '2' (length=1) 
     'requested' => string '2017-01-20 15:57:51' (length=19) 
     'accepted' => null 
     'swapped1' => null 
     'swapped2' => null 
     'rejected' => null 
     'rejected_by' => null 
     'swap_seen' => null 
     'msg_id' => string '22' (length=2) 
     'sender_id' => string '1' (length=1) 
     'msg' => string 'awdawd' (length=6) 
     'msg_time' => string '2017-01-20 15:58:00' (length=19) 
     'swap_id' => string '7' (length=1) 
     'seen' => null 
     'user1username' => string 'user1' (length=5) 
     'user2username' => string 'user2' (length=5) 
     'online' => string 'false' (length=5) 
    2 => 
    array (size=20) 
     'id' => string '6' (length=1) 
     'user1_id' => string '1' (length=1) 
     'user2_id' => string '2' (length=1) 
     'hasto' => string '2' (length=1) 
     'requested' => string '2017-01-20 15:11:58' (length=19) 
     'accepted' => null 
     'swapped1' => null 
     'swapped2' => null 
     'rejected' => null 
     'rejected_by' => null 
     'swap_seen' => null 
     'msg_id' => string '20' (length=2) 
     'sender_id' => string '1' (length=1) 
     'msg' => string 'awdadwdwa' (length=9) 
     'msg_time' => string '2017-01-20 15:46:44' (length=19) 
     'swap_id' => string '6' (length=1) 
     'seen' => null 
     'user1username' => string 'user1' (length=5) 
     'user2username' => string 'user2' (length=5) 
     'online' => string 'false' (length=5) 

Cependant dans JS console.log(active_swaps); renvoie cette:

Object {5: Object, 6: Object, 7: Object} 

Peu importe ce que je fais, il est toujours trié par clé (swap_id)! Apprécierait que quelqu'un puisse expliquer pourquoi cela se produit?

+0

Peut-être que ce n'est pas très bon d'utiliser 'numbers' pour les propriétés de l'objet json !? Testez-le avec 'echo" id {$ msg_item ['id']} ";'. – JustOnUnderMillions

+0

L'ordre des propriétés dans un objet javascript * n'est pas garanti *: http://stackoverflow.com/questions/5525795/does-javascript-guarantee-object-property-order –

+2

Copie possible de [La commande de propriété d'objet de garantie JavaScript est-elle valide? ] (http://stackoverflow.com/questions/5525795/does-javascript-guarantee-object-property-order) –

Répondre

0

Eh bien, on dirait que vous créez un objet avec $msg_item['id'] comme la clé:

var active_swaps = { 
<?php if (is_array($msg_data) || $msg_data instanceof Traversable):?> 
    <?php foreach($msg_data as $msg_item):?> 
     <?php echo $msg_item['id'];?> : <?php echo json_encode($msg_item);?>, 
    <?php endforeach;?> 
<?php endif;?> 
}; 

est interprété dans votre boucle comme:

var active_swaps = { 
    5 : 'JSON Object', 
    6 : 'JSON Object', 
    7 : 'JSON Object', 
}; 

(Nota: Je l'ai remplacé ici le réel Chaîne JSON par 'JSON Object' pour la lisibilité)

Vous devez créer un tableau au lieu d'un objet (qui signifie touches numériques et 0-indexé (Merci à @CharlotteDunois pour le souligner)), en tant que tel:

var active_swaps = []; 
<?php if (is_array($msg_data) || $msg_data instanceof Traversable):?> 
    <?php foreach($msg_data as $msg_item):?> 
     active_swaps.push(<?php echo json_encode($msg_item);?>); 
    <?php endforeach;?> 
<?php endif;?> 

Ce qui équivaudrait à:

var active_swaps = []; 
active_swaps.push('JSON Object'); 
active_swaps.push('JSON Object'); 
active_swaps.push('JSON Object'); 

Alors console.log(active_swaps) devrait retourner les éléments suivants :

[Object, Object, Object] 

EDIT: Garder la sortie comme un objet

Vous pouvez utiliser la clé de votre $msg_data comme JS clé de l'objet:

var active_swaps = { 
<?php if (is_array($msg_data) || $msg_data instanceof Traversable):?> 
    <?php foreach($msg_data as $key=>$msg_item):?> 
     <?php echo $key;?> : <?php echo json_encode($msg_item);?>, 
    <?php endforeach;?> 
<?php endif;?> 
}; 

La sortie de console.log(active_swaps) serait maintenant Object {0: Object, 1: Object, 2: Object}, en gardant soi-disant le même ordre que votre tableau PHP (ie 5, puis 7, puis 6)

+1

Que les tableaux ne possèdent pas de clés est réellement faux. Ils ont des clés, mais ils sont numériques et indexés sur 0. –

+0

En outre, cette question est en fait un doublon.Veuillez voter pour fermer (si vous choisissez "dupliquer", le doublon déjà sélectionné par un autre utilisateur est déjà répertorié pour vous, vous n'avez donc pas à le trouver). –

+0

@CharlotteDunois Désolé, c'est ce que je voulais dire. – roberto06