在php中移除外部数组


Removing an outer array in php

我有一些函数处理以数组格式提供的数据。这些函数都做同样的工作,所以我想把它们合并成一个函数。

问题是,它们每个都接收不同深度的数组:使用一维、二维和三维数组,在未来的一些实现中,甚至可能使用四维数组。

在任何情况下,重要的和必要的数据总是在最里面的两个数组中,所以我需要去掉外部数组,直到我只剩下最里面的两层。我的疑问不仅仅是如何做到这一点,而是如何做到优雅而有效,因为我发现我目前的方法相当笨拙。

当前方法:

function add() {
    $data = func_get_args();
    if(count($data)>0) {
        if(is_array($data[0])) {
            if(is_array($data[0][0])) {
                foreach($data[0] as $row) {
                    $this->items[] = $row;
                }
            } else {
                $this->items[] = $data[0];
            }
        } else {
            $this->items[] = $data;
        }
    }
} 

$list->add('one', 'two', 'three', 'four', 'five');
$list->add($data_from_DB_in_array_format);
$list->add(
    array(
        array('one', 'two', 'three', 'four', 'five'),
        array('six', 'seven', 'eight', 'nine', 'ten')
        )
    );
$list->add(
    array(
        array(
            array('one', 'two', 'three', 'four', 'five'),
            array('six', 'seven', 'eight', 'nine', 'ten')
            )
        )
    );

当通过func_get_args()恢复数据时,所有内容都放在一个额外的数组中。

结果必须是这样的:

    array(
        array('one', 'two', 'three', 'four', 'five'),
        array('six', 'seven', 'eight', 'nine', 'ten')
        );

只有一种方法可以实现这一点,那就是使用递归性和一点数组函数的魔力。这可能不是你确切的解决方案,但应该让你开始,如果你需要更多的帮助,请联系我:

<?php
$data = array(
    'test1' => array(
        'test2' => array(
            'test3' => array(
                'test4' => array(
                    1,
                    2,
                    3
                ),
                'test5' => array(
                    4,
                    5,
                    6
                ),
                'test6' => array(
                    7,
                    8,
                    9
                ),
            )
        )
    )
);
function returnLast2Levels($item){
   if(is_array($item) && is_array(reset($item)) && is_array(reset(reset($item)))){
      //This $item has more than 2 levels, delve deeper
      return returnLast2Levels(reset($item));
   }elseif(is_array($item) && is_array(reset($item)) && !is_array(reset(reset($item)))){
      //This $item has 2 levels deep of array
      return $item;
   }
}
var_dump(returnLast2Levels($data));