2011-02-25 152 views
3

我寫的代碼基於this similar question,但是我無法將其轉換爲在類中工作,並且沒有使用全局變量根據單獨陣列的順序對陣列​​進行排序

這是我想要做的。

假設我有2個數組:

$headings = array(
    'id' => 'ID', 
    'name' => 'Name', 
); 

$rows = array(
    array(
     'id' => 1, 
     'name' => 'Jo Blogs', 
    ), 
    array(
     'name' => 'John Smith', 
     'id' => 2, 
     'other' => 'Potentially other data' 
    ), 
); 

我想$rows分類到在$headings與出現在末端任何未定義的鍵指定的順序。例如,排序$rows後會是什麼樣子:

$rows = array(
    array(
     'id' => 1, 
     'name' => 'Jo Blogs', 
    ), 
    array(
     'id' => 2, 
     'name' => 'John Smith', 
     'other' => 'Potentially other data' 
    ), 
); 

其中工程類之外的代碼是

$headings = array(
    'id' => 'ID', 
    'name' => 'Name', 
); 

$rows = array(
    array(
     'id' => 1, 
     'name' => 'Jo Blogs', 
    ), 
    array(
     'name' => 'John Smith', 
     'id' => 2, 
     'other' => 'Potentially other data' 
    ), 
); 

var_dump($rows); 

array_walk($rows, "sort_it"); 

var_dump($rows); 

function sort_it(&$value, $key) { 
    uksort($value, "cmp"); 
} 

function cmp($a, $b) { 
    global $headings; 

    if (!isset($headings[$a]) || !isset($headings[$b]) || $headings[$a]>$headings[$b]){ 
     return 1; 
    }else{ 
     return -1; 
    } 

} 

和輸出:

array 
    0 => 
    array 
     'id' => int 1 
     'name' => string 'Jo Blogs' (length=8) 
    1 => 
    array 
     'name' => string 'John Smith' (length=10) 
     'id' => int 2 
     'other' => string 'Potentially other data' (length=22) 
array 
    0 => 
    array 
     'id' => int 1 
     'name' => string 'Jo Blogs' (length=8) 
    1 => 
    array 
     'id' => int 2 
     'name' => string 'John Smith' (length=10) 
     'other' => string 'Potentially other data' (length=22) 

哪是正確的。再次,我如何擺脫對全球的使用。我知道array_walk($rows, array($this, "sort_it"));將使用$this->sort_it()。不幸的是,這必須在PHP 5.2.14中工作(因此從5.3開始沒有花哨的幻想)。

謝謝。

+0

您是否需要與5.3以前的PHP版本兼容? – BoltClock 2011-02-25 11:36:29

+0

@BoltClock - 不幸的是。 5.2.14。我也將這個補充到這個問題上,謝謝。 – 2011-02-25 11:42:07

回答

2
$result = fix_array_order($rows, $headings); 
print_r($result); 

function fix_array_order($array, $order_array) 
{ 
    $order = array_keys($order_array); 

    $result = array(); 
    foreach($array as $arr) 
    { 
     $new_sub_array = array(); 
     foreach($order as $key) 
     { 
      $new_sub_array[$key] = $arr[$key]; 
     } 

     $diff = array_diff(array_keys($arr), $order); 
     foreach($diff as $diff_key) 
     { 
     $new_sub_array[$diff_key] = $arr[$key]; 
     } 
     $result[] = $new_sub_array; 
    } 
    return $result; 
} 
+0

完美,謝謝。 – 2011-02-25 12:15:40