2015-03-10 1 views
-1

Я запускаю цикл foreach для отображения результатов json, когда выполняются определенные условия, и хотел бы отсортировать их по полю name. Я пытаюсь использовать usort(), но, похоже, не понимаю.sort json приводит к циклу foreach

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 
    } 
    } 
} 

Так что это возвращает все результаты, которые я ожидать, но не отсортирован. Я попробовал usort() несколько разных способов, но просто упал на мое лицо ужасно :) Пожалуйста, помогите!

+1

Вы не может проходить через JSON в цикле for в PHP. Сначала вам нужно его расшифровать. 'json_decode ($ data_array, true);' –

+0

Я уже расшифровал - отредактировал мой вопрос, чтобы включить его –

+0

Кстати, почему -1 на вопрос? –

ответ

1

использование json_decode первым, чтобы преобразовать в массив PHP, установите флаг в значение TRUE для ассоциативного массива $myarr = json_decode($array, TRUE) Пробный заказ usort

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

Я надеюсь, что это помогает.

+0

спасибо! он сначала не работал, потому что у меня было это внутри другого цикла foreach на уровне выше того, что я описал здесь, что, на мой взгляд, недопустимо (получилось Can not redeclare custom_sort()) ... как только я выложу его на всех уровнях foreach петли, было хорошо идти! –

2

Ваш json неверно отформатирован. Есть пара дополнительных запятых, по одному после каждого элемента JPG. Убрано ниже.

Затем, json_decode строка json для ассоциативного массива PHP, и поскольку вы используете имена как индексы json, ksort (сортировка ключей) результирующего массива.

$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 

print_r после ksort дисплеев:

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 
     ) 

) 

Если вам нужно отсортировать по вложенному индексу, и вы хотите сохранить ассоциативный массив, используйте uasort:

uasort($data_array, 'sort_name_index'); 

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

вы правы в дополнительной запятой, я просто забыл ее вынуть, когда я удалил целую кучу дополнительных полей для этого примера ... как для ksort, он работает и очень прост, но я действительно хочу сортировать по поле «имя» по другим причинам. могут быть ситуации, когда они не совпадают. –

+0

Затем просто замените мой ksort на usort в ответе Conceptz. – bloodyKnuckles

 Смежные вопросы

  • Нет связанных вопросов^_^