2015-03-10 1 views
-1

J'utilise une boucle foreach pour afficher les résultats json, lorsque certaines conditions sont remplies, et que je souhaite trier par le champ name. J'essaie usort(), mais n'arrive pas à le comprendre.sort json aboutit à foreach loop

JSON:

{ 
    "Shawn Taylor":{ 
     "name":"Shawn Taylor", 
     "title":"", 
     "photo_url":"house_165 (1).jpg", 
     }, 
    "Another Name": { 
     "name":"Another Name", 
     "title":"Title is here", 
     "photo_url":"Person.jpg", 
     } 
} 

PHP:

$data_json = file_get_contents('data.json'); 
$data_array = json_decode($data_json, true); 
$i = 0; 
foreach($data_array as $key => $person){ 
    if($person['title'] == 'some title'){ 
    include('card.php'); 
    if(++$i % 4 === 0) { 
     echo '<div class="clearfix"></div>'; // inserts a clearfix every 4 cards 
    } 
    } 
} 

Donc, ce retourne tous les résultats je pense, mais pas triés. J'ai essayé usort() de différentes manières, mais je suis juste tombé sur mon visage terriblement :) S'il vous plaît, aidez!

+1

Vous ne peut pas parcourir JSON dans une boucle for en PHP. Vous devez d'abord le décoder. 'json_decode ($ data_array, true);' –

+0

J'ai déjà décodé - édité ma question pour l'inclure –

+0

BTW, pourquoi le -1 sur la question? –

Répondre

1

utilisation json_decode premier à convertir en tableau php, définissez l'indicateur sur TRUE pour un tableau associatif $myarr = json_decode($array, TRUE) l'essayer sur mesure usort

// Sort the multidimensional array 
usort($myarr, "custom_sort"); 
// Define the custom sort function 
function custom_sort($a,$b) { 
     return $a['name']>$b['name']; 
} 

J'espère que cela aide.

+0

merci! ça ne fonctionnait pas au début parce que j'avais dans une autre boucle foreach un niveau au dessus de ce que je décris ici, ce qui n'est pas autorisé (j'ai un Can not redeclare custom_sort()) ... une fois que je l'ai mis à l'extérieur foreach loops, c'était bon d'y aller! –

2

Votre fichier json est mal formaté. Il y a deux virgules supplémentaires, une après chaque élément JPG. Supprimé ci-dessous. Puis, json_decode Ensuite, json_decode la chaîne json à un tableau associatif PHP, et, puisque vous utilisez les noms comme index json, ksort (tri par clé) le tableau résultant.

$json_string = '{ 
    "Shawn Taylor":{ 
     "name":"Shawn Taylor", 
     "title":"", 
     "photo_url":"house_165 (1).jpg" 
     }, 
    "Another Name": { 
     "name":"Another Name", 
     "title":"Title is here", 
     "photo_url":"Person.jpg" 
     } 
}'; 

$data_array = json_decode($json_string, true); 
ksort($data_array); 

// the remaining code 

A print_r après les ksort affiche:

Array 
(
    [Another Name] => Array 
     (
      [name] => Another Name 
      [title] => Title is here 
      [photo_url] => Person.jpg 
     ) 

    [Shawn Taylor] => Array 
     (
      [name] => Shawn Taylor 
      [title] => 
      [photo_url] => house_165 (1).jpg 
     ) 

) 

Si vous devez trier par un index imbriqué, et que vous voulez maintenir le tableau associatif, utilisez uasort:

uasort($data_array, 'sort_name_index'); 

function sort_name_index($a, $b) { 
    return $a['name'] > $b['name']; 
} 
+0

vous avez raison sur la virgule supplémentaire, j'ai juste oublié de la retirer quand j'ai supprimé tout un tas de champs supplémentaires pour cet exemple ... comme pour ksort, cela fonctionne et est très simple, mais je veux vraiment trier par le champ "nom" pour d'autres raisons. il peut y avoir des situations où ils ne correspondent pas. –

+0

Puis échangez simplement mon ksort pour l'usort dans la réponse de Conceptz. – bloodyKnuckles