2012-01-19 50 views
9

Tôi có một loạt sản phẩm và tôi muốn sắp xếp chúng bằng một mảng khác.Sắp xếp mảng bằng mảng khác

$products = array(
    0 => 'Pro 1', 
    1 => 'Pro 2', 
    2 => 'Pro 3' 
); 

$sort = array(1,2,0); 

array_multisort($products, $sort); 

Mảng nên tại được ...

$products = array(
    0 => 'Pro 2', 
    1 => 'Pro 3', 
    2 => 'Pro 1' 
); 

Tôi dường như không được sử dụng một cách chính xác array_multisort. Ive đã thử các cách khác nhau trong 2 giờ ngay bây giờ ...

+1

chỉ số phần tử luôn khớp với các số trong mảng '$ sort'? –

+0

Tôi nghĩ rằng với 'mảng (1,2,0)' nó phải là '3,1,2', khi bạn muốn' 2,3,1' bạn nên sử dụng 'mảng (2,0,1)' – Vyktor

+1

Vyktor là đúng nếu bạn muốn sử dụng 'mảng_multisort ($ sort, $ products)', mảng cần phải là '[2,0,1]'. Hãy suy nghĩ về nó về "Tôi muốn phần tử đầu tiên của' $ products' là @ index 2, phần tử thứ hai ở chỉ số 0 và phần tử thứ ba ở chỉ mục 1. " Với mảng hiện tại của bạn, bạn chỉ cần sử dụng một số dạng lặp (tức là 'mảng_map') làm câu trả lời được minh họa. – Matthew

Trả lời

9

Nó có vẻ như đây là thích hợp hơn một loại:

$products = array_map(function($i) use ($products) { 
    return $products[$i]; 
}, $sort); 
+0

Thực ra, có cách nào khác để viết cái này không? Dreamweaver nghĩ rằng nó không hợp lệ php – tuurbo

+0

@tuurbo, nó hợp lệ cho PHP 5.3+. Dù có hay không Dreamweaver nghĩ rằng nó là hợp lệ là không liên quan ... Hoặc là các câu trả lời khác sẽ làm việc trên các phiên bản cũ của PHP. – Matthew

1

array_multisort sắp xếp mảng thứ hai và áp dụng thứ tự sắp xếp cho thứ tự đầu tiên. Để thực hiện công việc của bạn, mảng sắp xếp phải là $sort = array(2,0,1); (ngụ ý: đưa phần tử thứ 2 về 0, phần tử thứ 3 thành 1 và phần tử thứ nhất thành 2).

Bạn chỉ có thể sử dụng

foreach ($sort as $key) { 
    $sorted_products[] = $products[$key]; 
} 
+0

+1, bởi vì nếu tôi đã đọc điều này trước đó, tôi sẽ không cần phải để lại nhận xét về câu hỏi đó. – Matthew

1

array_multisort() sẽ không làm những gì bạn đang cố gắng để đạt được với mã cụ thể.

Đây là một chức năng mà sẽ:

function sort_by_other_array ($input, $order) { 
    $result = array(); 
    foreach ($order as $item) { 
    $result[] = $input[$item]; 
    } 
    return $result; 
} 

này không kiểm tra lỗi nhưng sẽ làm những gì bạn muốn. Bạn có thể cần thêm séc để đảm bảo rằng các khóa được chỉ định trong $order có mặt trong $input.

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