2014-02-28 126 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);