2012-03-18 94 views
1

所以我有这个数组。按键值对数组排序

Array 
(
    [0] => Array 
     (
      [key_1] => something 
      [type] => first_type 
     ) 

    [1] => Array 
     (
      [key_1] => something_else 
      [type] => first_type 
     ) 

    [2] => Array 
     (
      [key_1] => something_else_3 
      [type] => second_type 
     ) 

    [3] => Array 
     (
      [key_1] => something_else_4 
      [type] => second_type 
     ) 
) 

我有类型值在这样的模式来进行排序:

first_type 
second_type 
first_type 
second_type 

我的问题是,我该怎么办呢?

非常感谢!

+0

我想你必须自己写这个; '[type]'嵌套在它自己的数组中意味着标准的PHP函数会发现这个棘手的问题,尽管您应该尝试使用sort()和朋友来查看它们吐出的内容。 – Bojangles 2012-03-18 17:15:42

+1

您首先应该更清楚您的排序模式。我甚至没有看到你说过有一个。那么你的排序规范是什么? – hakre 2012-03-18 17:30:01

+0

比方说,我有类型键,值可以是1或2.我需要像这样排序:1 2 1 2 1 2 1 2 ...等 – 2012-03-18 17:32:13

回答

0

因此,这里是我如何得到它的工作:

function filter_by_value($array, $index, $value) { 
    if(is_array($array) && count($array) > 0) { 
     foreach(array_keys($array) as $key){ 
      $temp[$key] = $array[$key][$index]; 
      if ($temp[$key] == $value){ 
       $newarray[$key] = $array[$key]; 
      } 
     } 
    } 
    return $newarray; 
} 
$array = /* array here */ 
$type1 = array_values(filter_by_value($array, 'type', '1')); 
$type2 = array_values(filter_by_value($array, 'type', '2')); 
$i = 1; $x = 1; $y = 1; 
$sorted = array(); 
foreach ($array as $a) { 
    if ($i % 2) { 
     $sorted[$i-1] = $type1[$x-1]; 
     $x++; 
    } else { 
     $sorted[$i-1] = $type2[$y-1]; 
     $y++; 
    } 
    $i++; 
} 

找到filter_by_value()在php.net上,但我不记得在哪里,这不是由我做的。 也许这不是最好的解决方案,但它工作得很好。

0

如果sort()及其相关替代方法不起作用,则必须使用usort()uasort()以及自定义函数对此数组进行排序。

6

您需要使用usort和自定义比较功能,比较每个项目的key_1子键(您可以使用strcmp来方便地完成此操作)。假设你不想改变所得阵列的结构,它会是这个样子:

$arr = /* your array */ 
usort($arr, function($a, $b) { return strcmp($a['key_1'], $b['key_1']); }); 
+0

这样对数组排序如下:All first_type then all second_type。但我需要它像这样first_type |排序second_type | first_type | second_type |等等谢谢! – 2012-03-18 17:52:57

+0

@ Vlad.P:“sort”是错误的动词来形容你想要做什么... – Jon 2012-03-18 20:06:21

+0

对不起,也许安排更具描述性? – 2012-03-18 20:34:26