sort json导致foreach循环

时间:2015-03-10 20:34:23

标签: php json foreach usort

我正在运行foreach循环来显示json结果,当满足某些条件时,并希望按name字段对它们进行排序。我正在尝试usort(),但似乎无法弄明白。

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

所以这会返回我期望的所有结果,但不会排序。我尝试了几种不同的方法,但是我的脸上却非常沮丧:)请帮忙!

2 个答案:

答案 0 :(得分: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'];
}

答案 1 :(得分:1)

首先使用json_decode转换为php数组,将关联数组$myarr = json_decode($array, TRUE)的标志设置为TRUE 尝试自定义用户

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

我希望这会有所帮助。