2010-08-10 67 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