2011-12-23 48 views
35

Tôi đã đập đầu vào cái này một lúc rồi.Biến mảng đa chiều thành mảng một chiều

Tôi có mảng đa chiều này:

Array 
(
    [0] => Array 
     (
      [0] => foo 
      [1] => bar 
      [2] => hello 
     ) 

    [1] => Array 
     (
      [0] => world 
      [1] => love 
     ) 

    [2] => Array 
     (
      [0] => stack 
      [1] => overflow 
      [2] => yep 
      [3] => man 
     ) 

Và tôi cần phải có được điều này:

Array 
(
    [0] => foo 
    [1] => bar 
    [2] => hello 
    [3] => world 
    [4] => love 
    [5] => stack 
    [6] => overflow 
    [7] => yep 
    [8] => man 
) 

Bất kỳ ý tưởng?

Tất cả các giải pháp khác mà tôi tìm thấy giải quyết các mảng đa chiều với các khóa khác nhau. Các mảng của tôi chỉ sử dụng các phím số đơn giản.

+0

Mảng có thể được lồng nhiều hơn một cấp không? –

+1

Bản sao của [Làm thế nào để Flatten một mảng đa chiều?] (Http://stackoverflow.com/questions/1319903/how-to-flatten-a-multidimensional-array) và [nhiều người khác] (http://stackoverflow.com/tìm kiếm? q =% 5Bphp% 5D + san phẳng + mutlidimensional + mảng). – deceze

+0

[tìm kiếm @ giải pháp của tôi trong bài viết này] [1] [1]: http://stackoverflow.com/questions/6940217/multidimensional-array-to-array/13143579#13143579 – Dexy86

Trả lời

2

GIẢI PHÁP: Tôi đã sử dụng giải pháp của hakre, mặc dù tôi cũng đã thử giải pháp lừa đảo và nó cũng hoạt động tốt. Tôi đã viết:

$flat = call_user_func_array('array_merge', $array); 

Đơn giản.

+0

làm việc cho tôi, không biết tại sao họ downvoted, là có điều gì sai trái theo cách này? – Dheeraj

+0

Làm việc cho tôi. Tôi nghĩ rằng đây là một câu trả lời rõ ràng hơn và sạch hơn so với câu trả lời nhiều nhất. tôi tự hỏi tại sao những người khác không thấy điều này. :/ – Jefsama

+0

Chỉ hoạt động đối với các mảng một chiều. Để sử dụng hỗn hợp, chỉ có giải pháp làm việc là '$ new = iterator_to_array (new \ RecursiveIteratorIterator (new \ RecursiveArrayIterator ($ myArray)), null);' – stamster

9

Đây thực sự là tất cả để có nó:

foreach($array as $subArray){ 
    foreach($subArray as $val){ 
     $newArray[] = $val; 
    } 
} 
+0

nó không tuyến tính hoặc logN – Bsienn

54
array_reduce($array, 'array_merge', array()) 

Ví dụ:

$a = array(array(1, 2, 3), array(4, 5, 6)); 
$result = array_reduce($a, 'array_merge', array()); 

Kết quả:

array[1, 2, 3, 4, 5, 6]; 
+0

Đây không nhất thiết là cách tốt nhất để làm điều đó, nó có thể hơi khó hiểu đối với một; Tôi chỉ thích cách tiếp cận chức năng và viết một lớp lót cho bài tập. ; o) – deceze

+2

Đối số thứ hai có thể chỉ là 'array_merge'. – raugfer

36

Chức năng PHP array_merge­Docs có thể san bằng mảng của bạn:

$flat = call_user_func_array('array_merge', $array); 

Trong trường hợp mảng ban đầu có độ sâu cao hơn 2 cấp, SPL trong PHP có RecursiveArrayIterator bạn có thể sử dụng để làm phẳng nó:

$flat = iterator_to_array(new RecursiveIteratorIterator(new RecursiveArrayIterator($array)), 0); 

Xem cũng như: How to Flatten a Multidimensional Array?.

+1

Lớp SPL 'RecursiveIteratorIterator' là giải pháp tốt nhất có thể khi bạn có một mảng hỗn hợp (các khóa có cả kích thước N và các khóa như chuỗi/ints/bất kỳ mảng nào). – stamster

0
$blocked_dates = array(
        '2014' => Array 
         (
          '8' => Array 
           (
            '3' => '1', 
            '4' => '1',          
            '6' => '1',          
            '10' => '1', 
            '15' => '1', 
            '25' => '1' 

           ) 

         ), 
        '2015' => Array 
         (
          '9' => Array 
           (
            '3' => '1', 
            '4' => '1',          
            '6' => '1',          
            '10' => '1', 
            '15' => '1', 
            '25' => '1' 

           ) 

         )  

       ); 

RESUTL (ONE DIMENTIONAL ARRAY):

$unavailable_dates = array(); 
foreach ($blocked_dates as $year=>$months) { 

    foreach ($months as $month => $days) { 

     foreach ($days as $day => $value) { 

      array_push($unavailable_dates,"$year-$month-$day"); 
     } 

    } 
} 



$unavailable_dates = json_encode($unavailable_dates); 
print_r($unavailable_dates); 

OUTPUT : ["2014-8-3","2014-8-4","2014-8-6","2014-8-10","2014-8-15","2014-8-25","2015-9-3","2015-9-4","2015-9-6","2015-9-10","2015-9-15","2015-9-25"] 
3
foreach ($a as $v1) { 
    foreach ($v1 as $v2) { 
     echo "$v2\n"; 
    } 
} 

nơi $ a là tên mảng của bạn. for details

+2

Điều này không trả lời câu hỏi đầy đủ, anh ta muốn điền một mảng mới với các giá trị . (Tuy nhiên tôi nghĩ rằng họ đã tìm thấy một giải pháp kể từ 2 năm mà điều này đã được đăng) – Bun

+0

tôi cũng nghĩ rằng họ đã tìm thấy kết quả nhưng tôi chỉ muốn chia sẻ quan điểm của tôi. cảm ơn cho bình luận, không có cảm giác khó khăn :) – n00b

2

Tính đến PHP 5.3 là giải pháp ngắn nhất có vẻ là array_walk_recursive() với việc đóng cửa cú pháp mới:

function flatten(array $array) { 
    $return = array(); 
    array_walk_recursive($array, function($a) use (&$return) { $return[] = $a; }); 
    return $return; 
} 
1

Trong PHP5.6 có khác cách để giải quyết vấn đề này, kết hợp chức năng, array_shift() để loại bỏ phần tử đầu tiên của mảng ban đầu, array_pus() để thêm các mục vào mảng mới, điều quan trọng là của toán tử splapt/elipse ... nó sẽ giải nén trả về array_shitf() như một đối số.

<?php 

$arr = [ 
     ['foo', 'bar', 'hello'], 
     ['world', 'love'], 
     ['stack', 'overflow', 'yep', 'man', 'wow'] 
    ]; 

$new = []; 
while($item = array_shift($arr)){ 
    array_push($new, ...$item); 
} 

print_r($new); 

Output:

Array 
(
    [0] => foo 
    [1] => bar 
    [2] => hello 
    [3] => world 
    [4] => love 
    [5] => stack 
    [6] => overflow 
    [7] => yep 
    [8] => man 
    [9] => wow 
) 

Example - ideone

+0

Chỉ hoạt động đối với mảng một chiều. Để sử dụng hỗn hợp, chỉ có giải pháp làm việc mới là '$ new = iterator_to_array (new \ RecursiveIteratorIterator (new \ RecursiveArrayIterator ($ myArray)), null);' – stamster

1

tôi đã sử dụng mã này để giải quyết cùng một loại vấn đề. vì vậy bạn cũng có thể thử điều này.

function array_flatten($array) { 

if (!is_array($array)) 
{ 
    return FALSE; 
} 
    $result = array(); 
foreach ($array as $key => $value) 
{ 
    if (is_array($value)) 
    { 
    $result = array_merge($result, array_flatten($value)); 
    } 
    else { 
    $result[$key] = $value; 
    } 
} 
return $result; 
}