【问题标题】:Hierarchical Array Conversion to Flat Array [duplicate]分层数组转换为平面数组
【发布时间】:2016-06-10 19:43:31
【问题描述】:

我有一个数组

$array = array(
    array(1,2,3),
    array('bob','bill'),
    array(4,5,6,7) 
    //can have between 0 and 5 "rows"
);

我想转换成这样的数组...

[1,bob,4, 1, bob, 5, 1, bob, 6, 1, bob, 7, 1, bill, 4 .... 3, bill, 7]

我试图为此编写一个递归函数,看起来像......

function GetValues($array, $rowIndex, $valIndex, $values)
{
    if(!isset($array[$rowIndex]))
    {
        return $values;
    }
    if(!isset($array[$rowIndex][$valIndex]))
    {
        return GetValues($array,$rowIndex+1, 0, $values);
    }
    $values[] = $array[$rowIndex][$valIndex];

    return  GetValues($array,$rowIndex, $valIndex+1, $values);
}

最终正常迭代数组(打印 1,2,3,bob,bill,4,5,6,7)

【问题讨论】:

  • $flatArray = call_user_func_array('array_merge', $array);

标签: php combinations


【解决方案1】:
$array = array(
    array(1,2,3),
    array('bob','bill'),
    array(4,5,6,7) 
);
function combinations($arrays) {
    $result[] = array();
    foreach ($arrays as $key => $values) {
        $tmp = array();
        foreach ($result as $result_item) {
            foreach ($values as $value) {
                $tmp[] = array_merge($result_item, array($key => $value));
            }
        }
        $result = $tmp;
    }

    return $result;
}
$combinations_array = combinations($array);
$flat_string = '';
$flat_array = array();
foreach($combinations_array as $value){
        foreach($value as $v){
            $flat_string.=$v.',';
            $flat_array[]=$v;
        }
    }

echo rtrim($flat_string,',');
print_r($flat_array);

输出字符串: 1,bob,4,1,bob,5,1,bob,6,1,bob,7,1,bill,4,1,bill,5,1,bill,6,1,bill,7,2, bob,4,2,bob,5,2,bob,6,2,bob,7,2,bill,4,2,bill,5,2,bill,6,2,bill,7,3,bob, 4,3,bob,5,3,bob,6,3,bob,7,3,bill,4,3,bill,5,3,bill,6,3,bill,7

输出数组:

    Array
(
    [0] => 1
    [1] => bob
    [2] => 4
    [3] => 1
    [4] => bob
    [5] => 5
    [6] => 1
    [7] => bob
    [8] => 6
    [9] => 1
    [10] => bob
    [11] => 7
    [12] => 1
    [13] => bill
    [14] => 4
    [15] => 1
    [16] => bill
    [17] => 5
    [18] => 1
    [19] => bill
    [20] => 6
    [21] => 1
    [22] => bill
    [23] => 7
    [24] => 2
    [25] => bob
    [26] => 4
    [27] => 2
    [28] => bob
    [29] => 5
    [30] => 2
    [31] => bob
    [32] => 6
    [33] => 2
    [34] => bob
    [35] => 7
    [36] => 2
    [37] => bill
    [38] => 4
    [39] => 2
    [40] => bill
    [41] => 5
    [42] => 2
    [43] => bill
    [44] => 6
    [45] => 2
    [46] => bill
    [47] => 7
    [48] => 3
    [49] => bob
    [50] => 4
    [51] => 3
    [52] => bob
    [53] => 5
    [54] => 3
    [55] => bob
    [56] => 6
    [57] => 3
    [58] => bob
    [59] => 7
    [60] => 3
    [61] => bill
    [62] => 4
    [63] => 3
    [64] => bill
    [65] => 5
    [66] => 3
    [67] => bill
    [68] => 6
    [69] => 3
    [70] => bill
    [71] => 7
)

【讨论】:

  • 这个答案缺少教育解释。如果没有解释,此页面不太可能帮助未来的研究人员,也不适合结束未来的问题。
【解决方案2】:

您可能会遇到的一个问题是不知道原始数组有多大。您可以通过销毁数组来递归编写它。在此示例中,我将第一个元素从原始数组中移出。然后,每次递归调用时,我都会移出另一个元素。我使用 for 循环遍历这些值并返回我构建的内容。

function flatten($array)
{
    if(sizeof($array)==0) return null;
    $first = array_shift($array);
    $ret = array();
    foreach($first as $value)
    {
        $ret[] = $value;
        $sub = flatten($array);
        if($sub != null)
            $ret = array_merge($ret, $sub);
    }
    return $ret;
}

【讨论】:

  • 我试试看。数组被销毁的事实不会是一个问题,我可以在调用函数之前复制它
  • 我没有在函数中通过引用传递,所以它会复制数组并销毁副本。从技术上讲,它会复制整个数组,然后是缺少一个元素的数组,然后是缺少一个元素的数组,等等……
  • 是否可以让函数返回问题中指定的数组?我试过把它装起来,但是空白字符串有点尴尬
  • 打印“1,bob,4,5,6,7,bill,4,5,6,7,2,bob,4,5,6,7,bill,4,5 ,6,7,3,bob,4,5,6,7,bill,4,5,6,7,".
  • 感谢您的编辑。我的编辑真的很接近哈哈
猜你喜欢
  • 1970-01-01
  • 2011-08-30
  • 2020-05-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-30
  • 1970-01-01
相关资源
最近更新 更多