将嵌套数组放入一个数组中

时间:2012-02-14 15:20:25

标签: php arrays

假设我有一个这样的数组:

 Array(
      '1' => Array(
                 "ID" => 1,
                  "Name" => "name 1"
            ),
      '2' => Array (
                 Array(
                   "ID" => 2,
                   "Name" => "name 2"
                 )
             ),
      '3' => Array(
                 Array(
                   Array(
                     Array(
                        "ID" => 3,
                         "Name" => "name3"
                     )
                 )
              ),
       '4' => Array (
                 Array {
                  "ID" => 4,
                  "Name" => "name 4"
                 ),
                 Array(
                  "ID" => 5,
                  "Name" => "name 5"
                ),
                Array(
                  "ID" => 6,
                  "Name" => "name 6"
                )
             );

子阵列的数量没有订购,可能是3,4或5等...... 我想得到:

Array(
    Array( "ID" => 1, "Name" => "name 1"),
    Array( "ID" => 2, "Name" => "name 2"),
    Array( "ID" => 3, "Name" => "name 3"),
    Array( "ID" => 4, "Name" => "name 4"),
    Array( "ID" => 5, "Name" => "name 5"),
    Array( "ID" => 6, "Name" => "name 6"));

有一种简单的方法吗?

编辑

编辑上面的数组添加:

'4' => Array (
                 Array {
                  "ID" => 4,
                  "Name" => "name 4"
                 ),
                 Array(
                  "ID" => 5,
                  "Name" => "name 5"
                ),
                Array(
                  "ID" => 6,
                  "Name" => "name 6"
                )
             );

它们没有嵌套但我仍然希望它们在我的最终数组中。

感谢。

4 个答案:

答案 0 :(得分:2)

//Assuming your data is in $in

$out=array();
foreach($in as $k=>$v) {
  while ((is_array($v)) && (isset($v[0]))) $v=$v[0];
  //See below for next line
  $out[]=$v;
}

print_r($out);

标记的行为$out[$k]=$v;$out[]=$v;,具体取决于你想要保留第一级密钥。在您想要的输出中,您执行,因此请使用显示的版本

修改

随着您更改输入数组,您需要执行类似

的操作
function addtoarray($inarray, &$outarray) {
  foreach ($inarray as $i) {
    if (!is_array($i)) continue;
    if (isset($i['ID'])) $outarray[]=$i;
    else addtoarray($i,$outarray);
  }
}

$out=array();
addtoarray($in,$out);
print_r($out);

根据您的新输入数据对此进行了测试

答案 1 :(得分:0)

您可以通过数组递归并检查ID字段。

function combine_array(array $src, array &$dest)
{
    if( isset( $src['ID'] ) ) {
        $dest[] = $src;
        return;
    }

    foreach( $sub in $src ) {
        combine_array( $sub, $dest );
    }
}

刚刚写下了我的头脑,没有测试,所以它可能有一些问题。但那是基本的想法。

答案 2 :(得分:0)

这可能对你有用,假设$ array是变量而php 5.3

//process
$array = array_map(function($block) {
    $return = '';

    foreach ($block as $sub) {
        if (true === isset($sub['ID']) {
            $return = $block;
            break;
        }
    }

    return $block;
}, $array);

array_filter($array);  //remove empty elements

答案 3 :(得分:0)

写了一个快速的递归函数。您需要编写任何适当的错误处理并检查逻辑,因为数据中的差异很容易将其变为无限循环:

$output = array();

foreach ( $data as $d ) {
    $output[] = loop_data( $d );
}


function loop_data( $data ) {
    // Check if this is the right array
    if( ! array_key_exists( "ID", $data ) ) {
        // Go deeper
        $data = loop_data( $data[0] );
    }

    return $data;
}