2012-06-19 42 views
7

tôi có các mảng sau:Sắp xếp mảng sử dụng array_multisort

$array = array(
     'note' => array(), 
     'year' => array('2011','2010', '2012'), 
     'type' => array('conference', 'journal', 'conference'), 
    ); 

Và tôi sử dụng các chức năng sau đây để sắp xếp mảng bằng cách sử dụng các loại thực địa và mảng khác:

function array_multisort_by_order(array $array, $by, array $order) 
{ 
    $order = array_flip($order); 
    $params[] = $array[$by]; 
    foreach($params[0] as &$v) $v = $order[$v]; 
    foreach($array as &$v) $params[] = &$v; unset($v); 
    call_user_func_array('array_multisort', $params); 
    return $array; 
} 

Khi tôi gọi như sau chức năng tôi nhận được lỗi sau:

$array = array_multisort_by_order($array, 'type', array('conference', 'journal')); 

print_r($array['type']); 

lỗi:

Warning: array_multisort(): Array sizes are inconsistent. 

Tôi biết rằng các mảng không nhất quán. Có một chức năng tốt hơn để sử dụng?

Vui lòng kiểm tra: codepad

Output mong muốn:

Array 
(
[note] => Array 
    (
     [0] => 
     [1] => 
     [2] => 
    ) 

[year] => Array 
    (
     [0] => 2011 
     [1] => 2012 
     [2] => 2010 
    ) 

[type] => Array 
    (
     [0] => conference 
     [1] => conference 
     [2] => journal 
    ) 

) 

Ví dụ 2:

Mảng

$array = array(
     'note' => array([0]=>'test1', [1]=>'test2'), 
     'year' => array([0]=>'2011', [2]=>'2012'), 
     'type' => array([0]=>'conference',[1]=>'journal', [2]=>'conference'), 
    ); 

mong muốn Kết quả 2

Array 
(
[note] => Array 
    (
     [0] => test1 
     [1] => 
     [2] => tes2 
    ) 

[year] => Array 
    (
     [0] => 2011 
     [1] => 2012 
     [2] => 
    ) 

[type] => Array 
    (
     [0] => conference 
     [1] => conference 
     [2] => journal 
    ) 

) 

Cảm ơn

+3

Hm, đầu ra mong muốn sẽ làm cho mọi việc rõ ràng hơn sau đó quessing nó từ mã. Bạn có thể cung cấp điều đó không? – Wrikken

+0

đã thêm đầu ra mong muốn! – glarkou

+0

OK, còn lại 1 câu hỏi: các subrays luôn rỗng hoặc có độ dài nhất quán, hoặc chúng ta có thể mong đợi một subarray với 2 mục ở đây, và nếu vậy, làm thế nào để chúng ta đối phó với điều đó? Giả sử họ vẫn phù hợp với 2 mục đầu tiên từ các subarrays khác? – Wrikken

Trả lời

3

OK, vì vậy, một trong những giải pháp đầu tiên mà nói đến cái tâm là thêm vào các giá trị rỗng để làm cho chúng phù hợp:

function array_multisort_by_order(array $array, $by, array $order) 
{ 
    $max = max(array_map('count',$array)); 
    //or, alternatively, depending on input (if there are no 'complete' subarrays): 
    //$max = max(array_map(function($arr){return max(array_keys($arr));},$array))+1; 

    //ADDITION: negative numeric keys: 
    $min = min(array_map(function($arr){return min(array_keys($arr));},$array)); 
    $width = $max - min(0,$min); 

    foreach($array as &$sub){ 
     // $addin = array_diff_key(array_fill(0,$max,null),$sub); 
     // $addin changed for negative keys: 
     $addin = array_diff_key(array_combine(range($min,$max),array_fill(0,$width,null)),$sub); 
     $sub = $addin + $sub; 
     ksort($sub); 
    } 
    $order = array_flip($order); 
    $params[] = $array[$by]; 
    foreach($params[0] as &$v) $v = $order[$v]; 
    foreach($array as &$v) $params[] = &$v; unset($v); 
    call_user_func_array('array_multisort', $params); 
    //no closeures here: 
    //foreach($array as &$sub) $sub = array_filter(function($a){return !is_null($a);},$sub); 
    $filter = create_function('$a','return !is_null($a);'); 
    foreach($array as &$sub) $sub = array_filter($sub,$filter); 
    return $array; 
} 
+0

Có bạn đời tôi nghĩ về điều đó. Và tôi đã làm http://codepad.org/4QcAoemv nhưng nó không thực sự thêm các phím vào mảng ban đầu. Ngoài ra là có một cách để thoát khỏi những giá trị 'trống rỗng' sau khi thực hiện multisort? – glarkou

+0

Ugh, codepad đang chạy <5.3, không thể sử dụng bao đóng ... Một cái gì đó như thế này bạn có nghĩa là: http://codepad.org/5kMHlRc6 – Wrikken

+0

Có mà sẽ làm công việc. Nếu bạn có thể kiểm tra mã, tôi đã cố gắng sử dụng phương thức đơn giản hơn để điền vào các phím bị thiếu 'foreach ($ array ['type'] là $ k => $ v) { foreach ($ array as $ element => $ a) { $ iterator = $ array [$ element]; nếu (! Isset ($ iterator [$ k])) { $ iterator [$ key] = ''; } } } '. Điều này đã tạm thời lấp đầy mảng '$ iterator' và không phải mảng ban đầu. Cảm ơn một lần nữa vì sự giúp đỡ của bạn, tôi sẽ sử dụng giải pháp của bạn. Tôi đã đánh dấu nó là chính xác. Bạn có thể vui lòng chỉnh sửa câu trả lời của bạn không? – glarkou

Các vấn đề liên quan