2014-02-28 127 views
2

我有这样如何排序的关联数组,直到指定offfset - PHP

Array 
(
    [0] => Array 
     (
      ['id'] => 130 
      ['point'] => 45 

     ) 

    [1] => Array 
     (
      ['id'] => 190 
      ['point'] => 30 
     ) 

    [2] => Array 
     (
      ['id'] => 145 
      ['point'] => 79 
     ) 
    [3] => Array 
     (
      ['id'] => 178 
      ['point'] => 40 
     ) 
    [4] => Array 
     (
      ['id'] => 189 
      ['point'] => 79 
     ) 
    [5] => Array 
     (
      ['id'] => 132 
      ['point'] => 9 
     ) 

) 

我想这个数组分别对point按照从大到小的顺序每三个元素数组排序。

以上述例子

我希望分别对point排序上述阵列的[0],[1],[2][3],[4],[5]所以最终输出将是

Array 
    (
     [0] => Array 
      (
       ['id'] => 145 
       ['point'] => 79 

      ) 

     [1] => Array 
      (
       ['id'] => 130 
       ['point'] => 45 
      ) 

     [2] => Array 
      (
       ['id'] => 190 
       ['point'] => 30 
      ) 
     [3] => Array 
      (
       ['id'] => 189 
       ['point'] => 79 
      ) 
     [4] => Array 
      (
       ['id'] => 178 
       ['point'] => 40 
      ) 
     [5] => Array 
      (
       ['id'] => 132 
       ['point'] => 9 
      ) 

    ) 

我已经尝试了一些码,但是我不能”吨得到这个工作,请帮助。 由于事先

回答

0

尝试usort

usort($arr, function($e1, $e2) { 
     return $e1['point'] < $e2['point']; 
}); 

完整的解决方案:

$splits = array_chunk($arr, 3); 
$result = array(); 
foreach ($splits as $split) { 
    usort($split, function($e1, $e2) { 
      return $e1['point'] < $e2['point']; 
    }); 
    $result = array_merge($result, $split); 
} 

print_r($result); 
+0

不能给予解决..请阅读我的问题,请参见我需要的输出也 – user3357227

+0

这实际上是对一部分的过程,但我提供了[这里]更详细的解答(http://stackoverflow.com/a/22095397/1438393)。 –

+0

我想休息很容易,所以我更喜欢喝咖啡,而不是把它写下来的。 – steffen

2

下面是做这件事:

  • 斯普利特阵列分成两个块使用array_chunk()
  • 储存在两个不同的变量
  • 阵列定义自定义排序功能使用上述定义的回调函数
  • 加入作为回调用于usort()
  • 排序两个阵列既使用array_merge()以获得结果的阵列阵列

代码:

// split the array into two chunks of 3 
$chunks = array_chunk($data, 3); 

// assign them into separate array variables 
$firstArr = $chunks[0]; 
$secondArr = $chunks[1]; 

// define the sort function 
function cmp($a, $b){ 
    return ($a['point'] > $b['point']) ? -1 : 1; 
} 

// sort the two arrays 
usort($firstArr, 'cmp'); 
usort($secondArr, 'cmp'); 

// join them back to obtain the result 
$result = array_merge($firstArr, $secondArr); 

print_r($result); 

上面的代码,将照顾邻的压缩版本f。多块:

$result = array(); 
foreach (array_chunk($data, 3) as $chunk) { 
    usort($chunk, function($a, $b) { 
     return $a['point'] < $b['point']; 
    }); 
    $result = array_merge($result, $chunk); 
} 

Online demo

+0

感谢您的快速回复,但steffan的代码完全符合我的要求,所以我接受他的答案作为正确的答案,一旦我获得了足够的声望来赞扬,我一定会赞扬你。 – user3357227

+0

@ user3357227:这与您的“完美”要求不符? –

+0

你的代码也是正确的,但我必须编辑你的代码以获得更多的数组。他给出了一个合适的答案。而且我也接受了他的回答,可能我会给你提供赞扬,如果它对我来说与你积分 – user3357227

-1

试试这个

$arr_temp1 = array(); 
$arr_temp2 = array(); 
foreach($your_array as $key=>$arr) 
{ 
    if($key<3) 
    { 
     $arr_temp1[] = $arr; 
    } 
    else 
    { 
     $arr_temp2[] = $arr; 
    } 
} 

usort($arr_temp1, function($a1, $a2) { 
     return $a1['point'] < $a2['point']; 
}); 

usort($arr_temp2, function($a1, $a2) { 
     return $a1['point'] > $a2['point']; 
}); 

$arr_new = array(); 
foreach($arr_temp1 as $arr) 
{ 
    $arr_new[] = $arr; 
} 

foreach($arr_temp2 as $arr) 
{ 
    $arr_new[] = $arr; 
} 

print_r($arr_new);