2017-06-06 34 views
1

排序JSON我怎样才能标签排序依次为:部队PHP

1080p 
720p 
480p 
360p 


我已经试过PHP文件中所有的数组排序和一些其他“用户自定义”分类功能,但没有运气,它显示完全随机,不按顺序。

我原来的JSON:

[{"file":"***","label":"360p","default":"true","type":"video\/mp4"}, 
{"file":"***","label":"720p","type":"video\/mp4"}, 
{"file":"***","label":"1080p","type":"video\/mp4"}, 
{"file":"***","label":"480p","type":"video\/mp4"}] 
+0

你试过去掉“p”然后排序吗? – MikeBergerUS

+0

从数组中每个标签的explode()中移除“p”,然后使用'intval()'函数获取字符串的int值。然后根据索引 –

回答

1

这里我们使用usort以达到所需的输出。

Try this code snippet here

<?php 

ini_set('display_errors', 1); 
$json='[{"file":"***","label":"360p","default":"true","type":"video\/mp4"}, 
{"file":"***","label":"720p","type":"video\/mp4"}, 
{"file":"***","label":"1080p","type":"video\/mp4"}, 
{"file":"***","label":"480p","type":"video\/mp4"}]'; 
$array=json_decode($json,true); 

usort($array, function($value1,$value2){ 
    $value1["label"]=rtrim($value1["label"],"p"); 
    $value2["label"]=rtrim($value2["label"],"p"); 

    return $value1["label"]<$value2["label"]; 
}); 
2

这看起来非常简单的给我,您使用自定义比较函数的排序:

<?php 
$data = json_decode(<<<JSON 
[{"file":"***","label":"360p","default":"true","type":"video\/mp4"}, 
{"file":"***","label":"720p","type":"video\/mp4"}, 
{"file":"***","label":"1080p","type":"video\/mp4"}, 
{"file":"***","label":"480p","type":"video\/mp4"}] 
JSON 
); 

usort($data, function($a, $b) { 
    return intval($a->label) < intval($b->label); 
}); 
print_r($data); 

输出显然是:

Array 
(
    [0] => stdClass Object 
     (
      [file] => *** 
      [label] => 1080p 
      [type] => video/mp4 
     ) 

    [1] => stdClass Object 
     (
      [file] => *** 
      [label] => 720p 
      [type] => video/mp4 
     ) 

    [2] => stdClass Object 
     (
      [file] => *** 
      [label] => 480p 
      [type] => video/mp4 
     ) 

    [3] => stdClass Object 
     (
      [file] => *** 
      [label] => 360p 
      [default] => true 
      [type] => video/mp4 
     ) 

) 
+0

排序真的非常感谢您的帮助,但Sahil的回答已经解决了我的问题。 –

+0

@ScottWillsleans您应该在您的项目中使用此方法。没有必要在'usort()'的每次迭代中声明/覆盖变量这是更简洁的解决方案。 – mickmackusa

-1

第一您必须使用json_decode来解码JSON字符串。

使用usort对解码数组进行第二次排序。

<?php 
$array = json_decode($json); 
usort($array, function ($a, $b) { 
    $valueA = (int) $a->label; 
    $valueB = (int) $b->label; 
    if ($valueA == $valueB) { 
     return 0; 
    } 
    return ($valueA < $valueB) ? -1 : 1; 
}); 
+0

感谢您的帮助,已经解决! –