2013-06-27 47 views
14

OK, tôi đã có câu hỏi này trong stackoverflow nhưng buồn thay nó trong javascript - Javascript - sort array based on another arrayMảng PHP sắp xếp dựa trên một mảng khác?

và tôi muốn nó trong PHP

$data = array(
    "item1"=>"1", 
    "item2"=>"3", 
    "item3"=>"5", 
    "item4"=>"2", 
    "item5"=>"4" 
); 

để phù hợp với sự sắp xếp của mảng này:

sortingArr = array("5","4","3","2","1"); 

và đầu ra tôi đang tìm kiếm:

$data = array(
    "item3"=>"5", 
    "item5"=>"4", 
    "item2"=>"3", 
    "item4"=>"2", 
    "item1"=>"1" 
); 

Bất kỳ ý tưởng làm thế nào điều này có thể được thực hiện? Cảm ơn.

+0

Bạn đồng uld 'asort()' cả hai. – Albzi

+0

Sử dụng 'usort()', với hàm so sánh so sánh vị trí của các giá trị trong '$ sortingArr'. – Barmar

Trả lời

0

Hãy xem array_multisort. Tôi không hoàn toàn chắc chắn làm thế nào để sử dụng nó, như tôi chưa bao giờ tìm thấy một sử dụng thực tế cho nó (Tôi thích sử dụng usort để xác định rõ ràng các điều khoản của tôi), nhưng nó có thể làm việc cho bạn.

+1

Tôi không nghĩ rằng 'array_multisort()' làm những gì anh ta cần. Nó sẽ sắp xếp một mảng bình thường, và sau đó sắp xếp lại các mảng khác tương ứng. – Barmar

+0

Vì vậy, nếu mảng đầu tiên là một trong đó có chứa thứ tự mong muốn, không nên có nghĩa là đặt mảng '$ data' là thứ hai sắp xếp nó cho phù hợp ...? Tôi không biết, như tôi đã nói, không bao giờ sử dụng chức năng đó! –

+0

Tôi chưa sử dụng nó, nhưng các ví dụ trên trang tài liệu dường như không khớp với những gì anh ta muốn. Nhìn vào ví dụ # 1. Nó không giữ nguyên đầu vào theo thứ tự ban đầu của nó. – Barmar

7

Khá đơn giản?

$data = array(
    "item1"=>"1", 
    "item2"=>"3", 
    "item3"=>"5", 
    "item4"=>"2", 
    "item5"=>"4" 
); 

$sortingArr = array("5","4","3","2","1"); 

$result = array(); // result array 
foreach($sortingArr as $val){ // loop 
    $result[array_search($val, $data)] = $val; // adding values 
} 
print_r($result); // print results 

Output:

Array 
(
    [item3] => 5 
    [item5] => 4 
    [item2] => 3 
    [item4] => 2 
    [item1] => 1 
) 
+2

Tôi không nghĩ rằng đây là một giải pháp hiệu quả về bộ nhớ tốt. Hàm usort dễ dàng hơn và nhanh hơn trong trường hợp đó. Nhưng đây vẫn là giải pháp làm việc cho các mảng nhỏ. BR. –

+1

Miễn là điều này không được thực hiện trong một phần quan trọng của ứng dụng và dữ liệu là khá nhỏ, nó sẽ làm công việc của mình một cách dễ hiểu. – flu

1

Nhìn vào đoạn mã sau đây của tôi để sắp xếp mảng của bạn dựa trên mảng khác:

$res_arr = array(); 
for ($i = 0; $i < count($sortingArr); $i++) { 
    for ($j = 0; $j < count($data); $j++) { 
      if($data[$j] == $sortingArr[$i]) { 
      $res_arr[] = $data[$j]; 
      break; 
      } 
    } 
} 
// $res_array is your sorted array now 
0
<?php 
$data = array(
    "item1"=>"1", 
    "item2"=>"3", 
    "item3"=>"5", 
    "item4"=>"2", 
    "item5"=>"4" 
); 
$result=array_flip($data); 

krsort($result); 

$result=array_flip($result); 

print_r($result); 

//use rsort for the index array 

$sortingArr = array("5","4","3","2","1"); 

print_r($sortingArr); 
+0

Nó thực sự không có ý nghĩa để sắp xếp các giá trị của '$ data' theo giá trị. Vì '$ sortingArr' có thể không phải là giá trị giảm dần. Cũng sử dụng 'array_flip' và sau đó' krsort' chỉ là xấu, bạn có thể sử dụng 'rsort' trực tiếp. – HamZa

+0

$ sortingArr cũng được sắp xếp theo thứ tự giảm dần bằng cách sử dụng rsort. Cả hai mảng đều có sẵn theo thứ tự giảm dần ngay bây giờ – Sundar

8

Đối với một câu trả lời chi tiết, tại sao array_multisort làm không phù hợp với nhu cầu của bạn, hãy xem câu trả lời này, vui lòng: PHP array_multisort not sorting my multidimensional array as expected

Tóm lại: Bạn muốn sắp xếp một mảng dựa trên thứ tự được xác định trước. Câu trả lời cũng được đưa ra đằng kia, nhưng tôi sao chép một giải pháp cho câu trả lời này, quá:

Sử dụng usortarray_flip, vì vậy bạn có thể biến bạn mảng indexing (ValueByPosition) vào một PositionByValue Array.

$data = array(
    "item1"=>"1", 
    "item2"=>"3", 
    "item3"=>"5", 
    "item4"=>"2", 
    "item5"=>"4" 
); 

usort($data, "sortByPredefinedOrder"); 

function sortByPredefinedOrder($leftItem, $rightItem){ 
    $order = array("5","4","3","2","1"); 

    $flipped = array_flip($order); 

    $leftPos = $flipped[$leftItem]; 
    $rightPos = $flipped[$rightItem]; 
    return $leftPos >= $rightPos; 
} 

print_r($data); 
// usort: Array ([0] => 5 [1] => 4 [2] => 3 [3] => 2 [4] => 1) 
// uasort: Array ([item3] => 5 [item5] => 4 [item2] => 3 [item4] => 2 [item1] => 1) 

Tuy nhiên, điều này sẽ yêu cầu bạn phải dự đoán tất cả các mục có thể bên trong mảng đặt hàng được xác định trước hoặc tạo các mục khác theo cách thích hợp.

Nếu bạn muốn duy trì các phím assoc, hãy sử dụng uasort thay vì usort.

0

sử dụng usort()the right way tôi nghĩ rằng

Sắp xếp một mảng bằng giá trị sử dụng một hàm so sánh người dùng định nghĩa

bạn có thể làm như sau:

$data = array(
    "item1"=>"1", 
    "item2"=>"3", 
    "item3"=>"5", 
    "item4"=>"2", 
    "item5"=>"4" 
); 

$sortingArr = array("5","4","3","2","1"); 

$keys = array_flip($sortingArr); 

usort($data, function ($a, $b) use ($keys) { 
    return $keys[$a] > $keys[$b] ? 1 : -1; 
}); 

print_r($data); 

// Output 
// Array ([0] => 5 [1] => 4 [2] => 3 [3] => 2 [4] => 1) 

dụ sống: https://3v4l.org/75cnu

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