2010-08-10 32 views
3

我有我想要做以下凌亂樹多維數組:PHP,將多維數組中的所有數組遞歸提取爲一個扁平「持有者」數組?

提取每個陣列,不管多遠嵌套下來把它變成一個單一的「持有人陣」,所以這(只是一個基本的例子因爲這將是很多比這更復雜的儘可能的嵌套)

$this = array[0]=> (array[1]=>('a','b'), 
        array[2]=>(array[3]=>('c','d'))); 

會變成這樣的事情,如果它改變了指數爲每個陣列,只是讓他們仍然在一個沒關係陣列,但「扁平」,因此唯一的套料位於一個主保持器陣列內

$would_become = array[holder]=>(array[1]=>('a','b'), 
           array[2]=>(), 
           array[3]=>('c','d')); 

這背後的總體推理是,我有一堆嵌套的數組有一個共同的關鍵,​​如['filepath'],我想能夠做到像下面這樣的東西(將需要通過每個數組顯然在holder數組中,但是這顯示了爲什麼我需要這個的基本思想。

foreach ($holder_array as $holder_array) { 

// as an example: 
echo $holder_array['Path'] 
} 
+0

你能給出一個更真實的例子,看起來你的扁平化想法*可能不是最好的方法,等待進一步的細節。 – salathe 2010-08-10 11:26:59

+0

由於遞歸,在PHP中壓扁數組是一項棘手的業務。 – Artefacto 2010-08-10 12:39:50

+0

它爲獲取遞歸文件路徑,我使用了一個腳本來爲我做這個,但它仍然保持在一個凌亂的數組,而不是重寫整個其他腳本,這是相當長的這個解決方案相比,我認爲這會更容易,但對我來說這並不容易=),我很感謝大家對這個 – Rick 2010-08-10 18:24:10

回答

2
<?php 

$in = array(
     array('a','b'), 
     array(
      array('c','d') 
     ) 
); 

function flatten($in) { 
    $result = array(); 

    foreach ($in as $item) { 
     if (is_array($item)) { 
      $result[] = array_filter($item, 'notArray'); 
      $result = array_merge($result, flatten($item)); 
     } 
    } 

    return $result; 
} 


function notArray($in) { 
    return ! is_array($in); 
} 


$result = flatten($in); 
print_r($result); 
+0

幫助,謝謝,我真的很感謝幫助我這個..它的作品很棒=) – Rick 2010-08-10 18:22:13

0

在此鏈接:

http://php.net/manual/en/function.array-values.php

很多例子。

你想我想從你的話是什麼樣的從鏈接這個例子上述

評論後,我更新:

<?php 
    /* --------------------- 
    * @function array_flatten 
    * @param  array 
    * @since  0.1 
    * @return array 
    * @notes  flatten associative multi dimension array recursive 
    * @update 22:02 3/7/2009 
    * @author Rivanoor Bren <id_ivan(at)yahoo.com> 
    ---------------------- */ 
    function array_flatten($array, $preserve = FALSE, $r = array()){ 
     foreach($array as $key => $value){ 
      if (is_array($value)){ 
       foreach($value as $k => $v){ 
        if (is_array($v)) { $tmp = $v; unset($value[$k]); } 
       } 
       if ($preserve) $r[$key] = $value; 
       else $r[] = $value; 
      } 
     } 
     $r = isset($tmp) ? array_flatten($tmp, $preserve, $r) : $r; 
     return $r; 
    } 

    print_r($tmp); 
/* --- 
Array 
(
    [home] => Array 
     (
      [id] => 1 
      [pid] => 0 
      [link] => home 
      [subcat] => 
     ) 

    [works] => Array 
     (
      [id] => 2 
      [pid] => 0 
      [link] => works 
      [subcat] => Array 
       (
        [viz] => Array 
         (
          [id] => 4 
          [pid] => 2 
          [link] => viz 
          [subcat] => 
         ) 

        [script] => Array 
         (
          [id] => 5 
          [pid] => 2 
          [link] => script 
          [subcat] => Array 
           (
            [arch] => Array 
             (
              [id] => 6 
              [pid] => 5 
              [link] => arch 
              [subcat] => 
             ) 

           ) 

         ) 

       ) 

     ) 

    [blog] => Array 
     (
      [id] => 3 
      [pid] => 0 
      [link] => blog 
      [subcat] => 
     ) 

) 

--- */ 

    print_r(array_flatten($tmp, 1)); 

/* --- 
Array 
(
    [home] => Array 
     (
      [id] => 1 
      [pid] => 0 
      [link] => home 
      [subcat] => 
     ) 

    [works] => Array 
     (
      [id] => 2 
      [pid] => 0 
      [link] => works 
     ) 

    [blog] => Array 
     (
      [id] => 3 
      [pid] => 0 
      [link] => blog 
      [subcat] => 
     ) 

    [viz] => Array 
     (
      [id] => 4 
      [pid] => 2 
      [link] => viz 
      [subcat] => 
     ) 

    [script] => Array 
     (
      [id] => 5 
      [pid] => 2 
      [link] => script 
     ) 

    [arch] => Array 
     (
      [id] => 6 
      [pid] => 5 
      [link] => arch 
      [subcat] => 
     ) 

) 
--- */ 
?> 
+0

的幫助。也許我正在解釋你錯誤發佈的代碼,因爲我只是瞥了一眼它。但我不想要一個平面陣列,我知道如何做到這一點..我想要的是保存每個數組的值(但不是它的子數組,因爲它們將進入它們自己的數組),並將數組中的值放入持有者數組中的新數組中,被保留爲自己的數組..本質上,它使每個數組等於所有其他數據而不是樹狀結構, – Rick 2010-08-10 10:58:24

+0

我一直在查看大量的例子,但沒有找到一個具體做這件事,我不知道如何抓住例如,array_walk_recursive中多個數組中的每個特定數組似乎都無法通過數組挑選出來,而是通過key/value來完成,所以它們最終都會被拋入一個扁平數組中,這使得我數據不容易以我需要的方式訪問。 – Rick 2010-08-10 11:02:16

2
function flatten(&$arr) 
{ 
    foreach ($arr as $k=>$v) 
    { 
     if (is_array($v)) 
     { 
      flatten($arr[$k]); 
      foreach ($v as $kk=>$vv) 
      { 
       if (is_array($vv)) 
       { 
        unset($arr[$k][$kk]); 
        $arr[$kk] = $vv; // if you want the key to the array to be preserved. 
        // $arr[] = $vv; // would be safer, or check isset($arr[$kk]) first. 
       } 
      } 
     } 
    } 
} 

flatten($this[0]); 
$would_become = array('holder'=>$this[0]); 
+0

謝謝,我很欣賞這一點,我甚至沒有機會嘗試這一點,因爲另一個人爲我工作..我欣賞在這個 – Rick 2010-08-10 18:22:46