2011-06-27 39 views
7

Ok, vì vậy tôi có hai mảng.Mảng lệnh PHP theo tập hợp con

Một là lớn hơn một chút dữ liệu:

Array 
(
    [12] => blah 
    [36] => foo 
    [58] => blah 
    [60] => blah 
    [72] => blah 
    [90] => bar 
) 

khác là một tập hợp con nhỏ hơn của dữ liệu khác nhau nhưng có liên quan theo một thứ tự khác nhau, với mỗi phím tương ứng với khóa tương tự trong mảng lớn:

Array 
(
    [36] => foo data 
    [90] => bar data 
    [12] => blah data 
) 

Bây giờ, câu hỏi của tôi là, làm cách nào để nhận mảng đầu tiên theo thứ tự sao cho các khóa trong mảng đầu tiên có khóa tương ứng trong mảng thứ hai sẽ xuất hiện đầu tiên và theo thứ tự như mảng thứ hai?

Như vậy, như thế này:

Array 
(
    [36] => foo 
    [90] => bar 
    [12] => blah 
    [58] => blah 
    [60] => blah 
    [72] => blah 
) 
+1

Tôi không biết, nhưng +1 cho tên người dùng ... –

+0

array_sort có thể hoạt động cho bạn – Colum

+0

Bạn có thể phải sử dụng ['uksort'] (http://php.net/manual/en/function.uksort.php) nhưng có một chút khó khăn mà không cần sử dụng bao đóng. Bạn đang sử dụng phiên bản PHP nào? –

Trả lời

1
$array1 = array(12 => 1, 36 => 2, 58 => 3, 60 => 4, 72 => 5); 
$array2 = array(36 => 1, 60 => 2, 12 => 1); 

# obtaining keys in the order of question  
$result = array_intersect_key($array2, $array1); 

# assign values from original $array1 
foreach($result as $key => &$value) { 
    $value = $array1[$key]; 
} 
unset($value); # kill reference for safety 

# add missing elements from $array1 
$result += $array1; 

var_dump($result); 

Output:

array(5) { 
    [36]=> 
    int(2) 
    [60]=> 
    int(4) 
    [12]=> 
    int(1) 
    [58]=> 
    int(3) 
    [72]=> 
    int(5) 
} 

Xem Array Operators cho + cho mảng.

2

sử dụng uksort

chỉnh sửa: lỗi cú pháp/logic cố định chỉ ra bởi malko. cảm ơn bạn.

$array_to_sort = array 
(
    12 => "blah", 
    36 => "foo", 
    58 => "blah", 
    60 => "blah", 
    72 => "blah", 
    90 => "bar" 
); 

$sorted_array = array(
    36 => "foo data", 
    90 => "bar data", 
    12 => "blah data" 
); 

global $sorted_array_keys; 
$sorted_array_keys = array_keys($sorted_array); 

function cmp($a, $b) 
{ 
    global $sorted_array_keys; 
    $a_in_array = in_array($a, $sorted_array_keys); 
    $b_in_array = in_array($b, $sorted_array_keys); 
    if ($a_in_array && $b_in_array) { 
     return array_search($a, $sorted_array_keys) - array_search($b, $sorted_array_keys); 
    } else if ($a_in_array) { 
     return -1; 
    } else { 
     return 1; 
    } 
} 

uksort ($array_to_sort , cmp); 
print_r($array_to_sort); 

Điều này bắt đầu đẹp và sạch, nhưng kết thúc khá xấu và không rõ ràng. Bây giờ tôi đang nghiêng về phía một số câu trả lời khác thay vì tôi.

+0

xin lỗi vì lá phiếu xấu của tôi (đã xóa) có thể là giải pháp nhưng bạn nên cung cấp thêm chi tiết. – malko

+0

@malko - Tôi vừa đăng một ví dụ nên làm những gì được hỏi. –

+0

@ jacobs, một trong những lý do điều này sẽ không hoạt động, là chức năng cmp không biết $ phím ở tất cả. Xem bài viết của tôi để xem một ví dụ làm việc với uksort (sử dụng "đóng cửa" và "sử dụng" để cho phép hàm so sánh biết $ keys) – malko

5

Giải pháp O (n) đơn giản.

$arr1 = array(12 => 1, 36 => 2, 58 => 3, 60 => 4, 72 => 5); 
$arr2 = array(36 => 1, 60 => 2, 12 => 1); 

$result = array(); 

foreach($arr2 as $key => $value) { 
    $result[$key] = $arr1[$key]; 
    unset($arr1[$key]); 
} 

foreach($arr1 as $key => $value) { 
    $result[$key] = $arr1[$key]; 
} 

var_dump($result); 

Output:

array(5) { 
    [36]=> 
    int(2) 
    [60]=> 
    int(4) 
    [12]=> 
    int(1) 
    [58]=> 
    int(3) 
    [72]=> 
    int(5) 
} 
+0

Đã sắp đăng bài tương tự như nhau;) – malko

+0

+1 Đôi khi mọi thứ dễ hơn chúng có vẻ :) –

+0

Không cần bỏ đặt giá trị và không cần sao chép tất cả các mục trùng lặp trong một mục khác cho từng mục. – hakre

2

Dưới đây là một ví dụ sử dụng uksort với đóng cửa, nó sẽ có hiệu quả hơn trên mảng lớn tôi nghĩ, nhưng tôi đã không thực hiện bất kỳ điểm chuẩn như vậy ... khó khăn để thực sự xác nhận w/o kiểm tra.

$a = array(
    12 => 'blah' 
    ,36 => 'foo' 
    ,58 => 'blah' 
    ,60 => 'blah' 
    ,72 => 'blah' 
    ,90 => 'bar' 
); 

$b = array(
    36 => 'foo data' 
    ,90 => 'bar data' 
    ,12 => 'blah data' 
); 

$keysPosition = array_flip(array_keys($b)); 
uksort($a,function($a,$b) use ($keysPosition){ 
    if(isset($keysPosition[$a],$keysPosition[$b])){ 
     return $keysPosition[$a]>$keysPosition[$b]?1:-1; 
    }else if(isset($keysPosition[$a])){ 
     return -1; 
    }else if(isset($keysPosition[$b])){ 
     return 1; 
    } 
    return 0; 
}); 

print_r($a); 

kết quả:

Array 
(
    [36] => foo 
    [90] => bar 
    [12] => blah 
    [72] => blah 
    [58] => blah 
    [60] => blah 
) 

Nếu bạn không thể sử dụng đóng cửa (php < 5.3), bạn có thể làm điều gì đó tương tự như sử dụng một thế giới nhưng nó không sạch sẽ chút nào.

+0

Cảm ơn! Bộ não của tôi đau ít hơn bây giờ – herpyderpy

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