2012-12-17 27 views
10

tôi khủng khiếp với mảng thao tác ... cho cấu trúc này, tôi muốn loại bỏ các mảng cấp cao nhất và hợp nhất tất cả các tập con thành một mảng phẳng:php Di mảng mức cha mẹ từ bộ mảng và hợp nhất các nút

Array 
(
    [0] => Array 
     (
      [0] => Array 
       (
        [0] => hey.com 
       ) 

      [1] => Array 
       (
        [0] => you.com 
       ) 
     ) 
    [1] => Array 
     (
      [0] => Array 
       (
        [0] => this.com 
       ) 

      [1] => Array 
       (
        [0] => rocks.com 
       ) 
     ) 
) 

cấu trúc mong muốn:

Array 
    (
     [0] => hey.com 
     [1] => you.com 
     [2] => this.com 
     [3] => rocks.com 
    ) 

tốc độ là điều cần thiết - chúng ta sẽ đối phó với hàng trăm ngàn kết quả

+0

Bạn có thực sự muốn kết quả được 'mảng (array ('hey.com', 'you.com' , 'this.com', 'rocks.com')) '? – salathe

+0

Tôi chỉ cần một mảng phẳng của tất cả các giá trị thực tế, đó là tất cả. –

+0

Xem chỉnh sửa tôi vừa thực hiện –

Trả lời

13

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

$it = new RecursiveIteratorIterator(new RecursiveArrayIterator($data)); 
$list = iterator_to_array($it,false); 
var_dump($list); 

Output

array (size=4) 
    0 => string 'hey.com' (length=7) 
    1 => string 'you.com' (length=7) 
    2 => string 'this.com' (length=8) 
    3 => string 'rocks.com' (length=9) 

See Simple Demo

+0

Không có nhu cầu sử dụng vòng lặp trong trường hợp này, xem [nhận xét của tôi, trên] (http://stackoverflow.com/questions/13920659/php-remove-parent-level-array-from-set-of-arrays-and -merge-nodes # comment19189152_13920659). – salathe

+2

Sử dụng tốt 'iterator_to_array' + – Baba

+0

@JaredEitnier nó không phải là một dòng ... đảm bảo mã có thể đọc được ... – Baba

1
<?php 
//Very simple recoursive solution 
$array = array(
    array(
     array('hey.com'), 
     array('you.com') 
    ), 
    array(
     array('this.com'), 
     array('rocks.com'), 
     array(
      array('its.com'), 
      array(
       array('soo.com'), 
       array('deep.com') 
      ) 
     ) 
    ) 
); 

function deepValues(array $array) { 
    $values = array(); 
    foreach($array as $level) { 
     if (is_array($level)) { 
      $values = array_merge($values,deepValues($level)); 
     } else { 
      $values[] = $level; 
     } 
    } 
    return $values; 
} 

$values = deepValues($array); 
echo "<pre>"; 
print_r($values); 
echo "</pre>"; 
?> 

Tôi không biết làm thế nào để có được arral như thế này, nhưng giải pháp này là chỉ nhận được giá trị.

[sửa] Im xin lỗi, nó ngọt ngào nhất:

16
$flat = call_user_func_array('array_merge', $arr); 

Điều đó sẽ làm phẳng mảng bằng chính xác một mức. Nó sẽ lấy đầu vào mẫu bạn đã cung cấp và tạo ra kết quả mong muốn mà bạn đã yêu cầu.

Hãy chắc chắn rằng

  1. mảng cha mẹ của bạn sử dụng các chỉ số số
  2. mảng mẹ có ít nhất một phần tử con, nếu không bạn sẽ nhận được một lỗi php do array_merge phàn nàn về không có đối số.

Đối với những người tự hỏi làm thế nào nó hoạt động:

// with 
$arr = [ [1,2,3], [4,5,6] ]; 
// call_user_func_array('array_merge', $arr) is like calling 
array_merge($arr[0], $arr[1]); 

// and with 
$arr = [ [1,2,3], [4,5,6], [7,8,9] ]; 
// then it's like: 
array_merge($arr[0], $arr[1], $arr[2]); 
// and so on... 

Nếu bạn đang sử dụng php 5.6+, các nhà điều hành splat (...) có thể là cách dễ đọc hơn để làm điều này:

$flat = array_merge(...$arr); 
+2

hoàn hảo !!! :) +1 – SagarPPanchal

0

Nếu mảng chỉ có một cấp từ chỉ mục kết hợp và chỉ với một phần tử:

foreach($arr as $key=>$val) { 
    if (is_array($arr[$key])) $arr[$key] = $arr[$key][0]; 
} 

Getting: 

[file] => Array (
      [name] => black.png 
      [type] => image/png 
      [tmp_name] => /tmp/phpfupdU5 
      [error] => 0 
      [size] => 197782 
     )  

from:  

[file] => Array (
      [name] => Array 
       ([0] => black.png) 
      [type] => Array 
       ([0] => image/png) 
      [tmp_name] => Array 
       ([0] => /tmp/phpfupdU5) 
      [error] => Array 
       ([0] => 0) 
      [size] => Array 
       ([0] => 197782) 
     ) 
0

Nếu các giá trị luôn luôn ở cùng một mức độ sâu bạn thực sự có thể sử dụng array_merge:

$array = [                                                         
    [ 
     ['hey.com'], 
     ['you.com'], 
    ],                                                     
    [ 
     ['this.com'], 
     ['rocks.com'], 
    ],                                                    
]; 

print_r(array_merge(... array_merge(... $array))); 

Getting: 

Array 
(
    [0] => hey.com 
    [1] => you.com 
    [2] => this.com 
    [3] => rocks.com 
) 
Các vấn đề liên quan