2010-11-19 31 views
5

thể trùng lặp:
How to Flatten a Multidimensional Array?Đơn giản hóa một mảng lồng nhau thành một mảng mức đơn

Hãy nói rằng tôi có một mảng như thế này:

array (
    1 => 
    array (
    2 => 
    array (
     16 => 
     array (
     18 => 
     array (
     ), 
    ), 
     17 => 
     array (
    ), 
    ), 
), 
    14 => 
    array (
    15 => 
    array (
    ), 
), 
) 

Làm thế nào tôi sẽ đi về tranforming nó thành mảng như thế này?

array(1,2,16,18,17,14,15); 
+0

sử dụng var_export hoặc cung cấp cho chúng tôi mảng ban đầu. –

+0

@Elzo Valugi: Tôi đã cập nhật câu hỏi của mình. –

+1

@Gordon: Nó không hoàn toàn giống nhau. Trong trường hợp OPs, các giá trị thực sự là các * phím *. –

Trả lời

2

Xin lỗi vì sự closevote. Didnt chú ý đúng về bạn muốn chìa khóa. Giải pháp dưới đây:

$iterator = new RecursiveIteratorIterator(
    new RecursiveArrayIterator($arr), 
    RecursiveIteratorIterator::SELF_FIRST); 

$keys = array(); 

và sau đó một trong hai

$keys = array(); 
foreach($iterator as $key => $val) { 
    $keys[] = $key; 
} 

hoặc với instance iterator trực tiếp

$keys = array(); 
for($iterator->rewind(); $iterator->valid(); $iterator->next()) { 
    $keys[] = $iterator->key(); 
} 

hoặc nhiều phức tạp hơn mức cần thiết

iterator_apply($iterator, function(Iterator $iterator) use (&$keys) { 
    $keys[] = $iterator->key(); 
    return TRUE; 
}, array($iterator)); 

cho

Array 
(
    [0] => 1 
    [1] => 2 
    [2] => 16 
    [3] => 18 
    [4] => 17 
    [5] => 14 
    [6] => 15 
) 
0

Nếu chúng ta xem mảng lồng nhau là cấu trúc cây, bạn có thể áp dụng độ sâu đầu tiên để chuyển đổi nó thành danh sách. Đó là, thành một mảng duy nhất mà bạn mong muốn.

2

thế nào về một số đệ quy

$result = array(); 
function walkthrough($arr){ 
$keys = array_keys($arr); 
array_push($result, $keys); 
foreach ($keys as $key) 
{ 
    if (is_array($arr[$key])) 
     walkthrough($arr[$key]); 
    else 
     array_push($result,$arr[$key]); 
} 
return $result; 
} 

walkthrouth ($ your_arr);

P.S.:Code có thể nghe trộm, nhưng bạn đã có một ý tưởng :)

0

Tôi đã tìm kiếm tất cả các câu hỏi tương tự và có vẻ như không có cách nào mà không có một đệ quy mà có thể giữ các phím đặt hàng còn nguyên vẹn.

Vì vậy, tôi chỉ cần đi với đệ quy cổ điển:

function getArrayKeysRecursive(array $theArray) 
{ 
    $aArrayKeys = array(); 
    foreach ($theArray as $k=>$v) { 
     if (is_array($v)) { 
      $aArrayKeys = array_merge($aArrayKeys, array($k), getArrayKeysRecursive($v)); 
     } else { 
      $aArrayKeys = array_merge($aArrayKeys, array($k)); 
     } 
    } 
    return $aArrayKeys; 
} 
1
function flattenArray($array) { 
$arrayValues = array(); 
foreach (new RecursiveIteratorIterator(new RecursiveArrayIterator($array)) as $val) { 
    $arrayValues[] = $val; 
} 
return $arrayValues; 
} // function flattenArrayIndexed() 
+0

Điều đó chỉ giấu đi sự đệ quy. Nhưng sự đệ quy vẫn còn đó. Thêm vào đó tôi cần các khóa mảng, không phải các giá trị. –

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