2012-01-26 128 views
0

可能重複:
Sort multidimensional array by multiple keys排序PHP陣列由3個按鍵

我試圖找到某種方式如何排序鍵名數組,但沒有那麼遠的工作。對我來說棘手的部分是通過對3個鍵進行分組來排序數組。我有這個數組。

[0] => Array 
    (
     [id] => 8 
     [zbo_data] => blah 
    ) 

[1] => Array 
    (
     [id] => 6 
     [szn_data] => blah 
    ) 

[2] => Array 
    (
     [id] => 5 
     [gcz_data] => blah 
    ) 

[3] => Array 
    (
     [id] => 3 
     [gcz_data] => blah 
    ) 

[4] => Array 
    (
     [id] => 2 
     [zbo_data] => blah 
    ) 

[5] => Array 
    (
     [id] => 1 
     [szn_data] => blah 
    ) 

,我需要通過3組順序排序的:szn_data,zbo_data,gcz_data但我還需要通過szn_data保持[ID](基本上是初級訂單的訂單,zbo_data,gcz_data ,secondary [id])。有解決方案嗎?或者我應該構造不同的數組來排序它?我試圖找出超過6個小時。任何幫助深表感謝。

我所需的輸出是:

[0] => Array 
    (
     [id] => 6 
     [szn_data] => blah 
    ) 

[1] => Array 
    (
     [id] => 8 
     [zbo_data] => blah 
    ) 

[2] => Array 
    (
     [id] => 5 
     [gcz_data] => blah 
    ) 

[3] => Array 
    (
     [id] => 1 
     [szn_data] => blah 
    ) 

[4] => Array 
    (
     [id] => 2 
     [zbo_data] => blah 
    ) 

[5] => Array 
    (
     [id] => 3 
     [gcz_data] => blah 
    ) 

回答

0

或者這樣,從最大到最小任何順序在一個陣列

$arr = array (
    array(
     'id' => 8, 
     'zbo_data' => 'blah' 
    ), 
    array(
     'id' => 6, 
     'szn_data' => 'blah' 
    ), 
    array(
     'id' => 5, 
     'gcz_data' => 'blah' 
    ), 
    array(
     'id' => 3, 
     'gcz_data' => 'blah' 
    ), 
    array(
     'id' => 2, 
     'zbo_data' => 'blah' 
    ), 
    array(
     'id' => 1, 
     'szn_data' => 'blah' 
    ) 
); 
    usort($arr, "my_func"); 
    var_dump($arr); 

    function my_func($a, $b) 
    { 
    $vars = array('szn_data', 'zbo_data', 'gcz_data'); // order of the keys 
    $id1 = $a['id']; $id2 = $b['id']; unset($a['id'], $b['id']); 
    $index1 = array_search(key($a), $vars); 
    $index2 = array_search(key($b), $vars); 
    if ($index1 == $index2) { 
     if ($id1 == $id2) return 0; 
     return ($id1 < $id2) ? 1 : -1; 
    } 
    return ($index1 < $index2) ? -1 : 1; 
    } 

PS列出:

通過szn_data基本上初級順序,zbo_data,gcz_data ,secondary [id]

它不符合t o你想要的輸出。次要是指當其他鍵相同時比較ID。

PS:更新 - 這個代碼是不是很好或完美,但它會給你你所需要的

$vars = array('szn_data', 'zbo_data', 'gcz_data'); 
    $arr = array (
    array(
     'id' => 8, 
     'zbo_data' => 'blah' 
    ), 
    array(
     'id' => 6, 
     'szn_data' => 'blah' 
    ), 
    array(
     'id' => 5, 
     'gcz_data' => 'blah' 
    ), 
    array(
     'id' => 3, 
     'gcz_data' => 'blah' 
    ), 
    array(
     'id' => 2, 
     'zbo_data' => 'blah' 
    ), 
    array(
     'id' => 1, 
     'szn_data' => 'blah' 
    ) 
); 

    $temp = array(); 
    $cnt = count($arr); 
    foreach($arr as $item) 
    { 
    foreach($vars as $v) 
    { 
     if (isset($item[$v])) { $temp[$v][$item['id']] = $item; break; } 
    } 
    } 
    // sort by id 
    foreach($vars as $v) 
    { 
    krsort($temp[$v]); 
    $temp[$v] = array_values($temp[$v]); 
    } 

    $arr = array(); $i = 0; $j = 0; 
    $completed = false; 
    do { 
    foreach($vars as $v) 
    { 
     if ($i++>=$cnt) { $completed = true; break; }   
     if (isset($temp[$v][$j])) $arr[] = $temp[$v][$j]; 
    } 
    $j++; 
    } while (!$completed); 
    // output 
    var_dump($arr) 
+0

這就是排序數組like :szn_data,szn_data,zbo_data,zbo_data,gcz_data,gcz_data,但它是由那些3組(szn_data,zbo_data,gcz_szn_data,szn_data,zbo_data,gcz_data,...) –

+0

@ user1172238讀取更新 - 您告訴這樣做。總是第一,只有當主要條件的項目是相等的,那麼應該使用第二個。ps:好吧,我明白了,讓我看看 – Cheery

+0

@Cherry是的,對於訂購抱歉,它不像我寫的第一次。 –

1

使用usort和實現比較功能,如你所願。例如:

$result = usort($arr, function($a,$b) { 

    $keys = array('szn_data', 'zbo_data', 'gcz_data'); 
    foreach ($keys as $key) { 
    // make sure to add here handling of missing keys 
    $diff = strcmp($b[$key], $a[$key]); 
    if ($diff!=0) { 
     return $diff; 
    } 
    } 

    return $b['id'] - $a['id']; 
}); 
+0

我已經嘗試過usort。你能給我一些比較函數的提示嗎? –

+0

@ user1172238我剛剛做了,看我的例子 –

+0

我必須承認我不能找出部分//更多的比較:(你可以,請如此善良併發布整個功能?提前致謝。 –