2010-03-18 73 views
6

Làm cách nào tôi có thể nhận được một mảng giá trị từ một mảng kết hợp?Cách lấy mảng giá trị từ một mảng kết hợp?

Associate mảng Ví dụ:

Array 
(
    [0] => Array 
     (
      [0] => 1 
      [1] => 2 
      [2] => 3 
     ) 
    [1] => Array 
     (
      [0] => 4 
      [1] => 5 
      [2] => 6 
     ) 
    [2] => Array 
     (
      [0] => 7 
     ) 
) 

mong muốn Output

Array 
(1,2,3,4,5,6,7) 

Trả lời

8

Không chắc nó sẽ phù hợp với bạn, vì nó là PHP> = chỉ 5.3, nhưng đây là một giải pháp khả thi, sử dụng array_walk_recursive và đóng cửa(xem Anonymous functions):

$array = array(
    array(1, 2, 3), 
    array(4, 5, 6), 
    array(7), 
); 

$result = array(); 
array_walk_recursive($array, function ($value, $key) use (& $result) { 
    $result[] = $value; 
}); 
var_dump($result); 

Và kết quả:

array 
    0 => int 1 
    1 => int 2 
    2 => int 3 
    3 => int 4 
    4 => int 5 
    5 => int 6 
    6 => int 7 

Về cơ bản, cách đóng là cách duy nhất tôi có được điều này rk: nó được sử dụng để nhập biến số $result, theo tham chiếu, vào hàm ẩn danh.



Và, chỉ để gửi nó, duy nhất tôi đã làm việc này cho PHP 5.2 (tức là không sử dụng một đóng cửa) là với điều này:

$result = array(); 
array_walk_recursive($array, 'my_func', & $result); 
var_dump($result); 

function my_func($value, $key, & $result) { 
    $result[] = $value; 
} 

Những công trình quá - nhưng tăng cảnh báo:

Deprecated: Call-time pass-by-reference has been deprecated 

Thật không may, tôi không tìm thấy một cách để nhận này để làm việc mà không đi $result bằng cách tham khảo tại cuộc gọi thời gian :-(
(Có lẽ ai đó có một ý tưởng, về làm thế nào để làm điều đó?)

+0

+1. Mặc dù tôi có câu trả lời không sử dụng bao đóng, đây là suy nghĩ đầu tiên của tôi về cách thực hiện. Trả lời các câu hỏi PHP sẽ thú vị hơn khi PHP5.3 trở nên phổ biến hơn. – Yacoby

+0

@Yacoby: PHP 5.3 FTW! * (chức năng ẩn danh và đóng cửa là một điều tôi thực sự muốn có thể sử dụng, tại nơi làm việc ... Nhưng chúng tôi đang sử dụng PHP 5.2 ;-() * –

1

Do một array_merge() trên mỗi thành viên riêng biệt.

$test = Array 
(
    "0" => Array 
     (
      0 => 1, 
      1 => 2, 
      2 => 3, 
     ), 
    "1" => Array 
     (
      0 => 4, 
      1 => 5, 
      2 => 6, 
     ), 
    "2" => Array 
     (
      0 => 7, 
     ) 
); 

print_r(array_merge($test[0],$test[1],$test[2])); 
// Array ([0] => 1 [1] => 2 [2] => 3 [3] => 4 [4] => 5 [5] => 6 [6] => 7) 
1

dưới php 5.3 này nên được thực sự thoải mái và thuận tiện, vì các phần tử mảng được sử dụng bởi array_reduce được hiểu là hỗn hợp chứ không phải là cố định như nguyên

nên

print_r(array_reduce($test, 'array_merge')) 

Tôi chưa thử nghiệm - không có bản sao 5.3 - ít nhất trong lý thuyết nên thực hiện. Dưới < 5.3 bạn sẽ gặp lỗi.

Lưu ý rằng điều này chỉ hợp nhất cấp cao nhất của mảng, không giống như giải pháp sử dụng array_walk_recursive.

+1

+1 để nhận thấy sự thay đổi gần đây đối với array_reduce. Tuy nhiên, bạn cần cung cấp một mảng inital để bắt đầu. array_reduce ($ aNestedArray, 'array_merge', mảng()) – goat

1
$flattened = call_user_func_array('array_merge', $array); 
Các vấn đề liên quan