【问题标题】:PHP Change array to one dimensionPHP将数组更改为一维
【发布时间】:2014-11-25 12:06:17
【问题描述】:

生成数组格式的函数:

function buildTree(array $elements, $parentId = 0) {
    $branch = array();

    foreach ($elements as $element) {
        if ($element['parent_id'] == $parentId) {
            $children = buildTree($elements, $element['id']);
            if ($children) {
                $element['children'] = $children;
            }
            $branch[] = $element;
        }
    }

    return $branch;
}

$tree = buildTree($rows);

数组生成:

 Array
    (
        [0] => Array
            (
                [TASK_ID] => 2
                [PARENT_TASKID] => 0
                [TASK_LEVEL] => 0
                [children] => Array
                    (
                        [0] => Array
                            (
                                [TASK_ID] => 9
                                [PARENT_TASKID] => 2
                                [TASK_LEVEL] => 1
                            )

                        [1] => Array
                            (
                                [TASK_ID] => 10
                                [PARENT_TASKID] => 2
                                [TASK_LEVEL] => 1
                            )

                    )

            )

[1] => Array
        (
            [TASK_ID] => 1
            [PARENT_TASKID] => 0
            [TASK_LEVEL] => 0
            [children] => Array
                (
                    [0] => Array
                        (
                            [TASK_ID] => 4
                            [PARENT_TASKID] => 1
                            [TASK_LEVEL] => 1
                        )

                    [1] => Array
                        (
                            [TASK_ID] => 5
                            [PARENT_TASKID] => 1
                            [TASK_LEVEL] => 1
                            [children] => Array
                                (
                                    [0] => Array
                                        (
                                            [TASK_ID] => 6
                                            [PARENT_TASKID] => 5
                                            [TASK_LEVEL] => 2
                                        )

                                )

                        )

                )

        )
    )

如何将上述格式更改为以下格式:

Array
(
    [0] => Array
        (
            [TASK_ID] => 2
            [PARENT_TASKID] => 0
        )

    [1] => Array
        (
            [TASK_ID] => 9
            [PARENT_TASKID] => 2
        )

    [2] => Array
        (
            [TASK_ID] => 10
            [PARENT_TASKID] => 2
        )

)

尝试以下代码:

$flat = call_user_func_array('array_merge', $array);

$array  = your array

$result = call_user_func_array('array_merge', $array);

echo "<pre>";
print_r($result);

但似乎不起作用。请帮忙。

谢谢。

【问题讨论】:

  • 你自己有没有尝试过?
  • 你是如何生成数组的?您必须向我们提供更多信息以帮助您。还有你自己试过什么?
  • 请查看相关更新
  • 为什么要投反对票?投反对票必须有理由。

标签: php arrays


【解决方案1】:

您应该使用递归函数来展平树,就像您使用递归函数来构建树一样。

function flattenTree($tree)
{
    $flat = array();
    foreach ($tree as $item) {
        if (array_key_exists('children', $item)) {
            $children = $item['children'];
            unset($item['children']);
            $flat[] = $item;
            $flat = array_merge($flat, flattenTree($children));
        } else {
            $flat[] = $item;
        }
    }
    return $flat;
}

$flat = flattenTree($tree);

【讨论】:

    【解决方案2】:
    <?php
    $arr = array();
    $i = 0;
    foreach ($your_array[0] as $k => $v) {
        if ($k == 'TASK_ID' OR $k == 'PARENT_TASKID') {
            $arr[$i][$k] = $v;
        }
        $i++;
    }
    ?>
    

    尝试输出:

    <?php
    echo '<pre>';
    print_r($arr);
    echo '</pre>';
    ?>
    

    希望,它对你有用。

    【讨论】:

    • 输出 -> Array ( [0] =&gt; Array ( [TASK_ID] =&gt; 2 ) [1] =&gt; Array ( [PARENT_TASKID] =&gt; 0 ) )
    • 添加数组的 var_dump 以便我可以运行。
    • var_dump 的预期或现有数组?
    【解决方案3】:

    我在捕获多个文件时一直使用它来解析 $_FILES

    function multi_array($array)
    {
        $new = array();
        foreach($array as $key=>$elem)
        {
            if(is_array($elem))
            {
                foreach($elem as $x=>$val)
                {
                    if(!is_array($val))
                    {
                        $new[$x][$key] = $val;
                    }
                }
            }
        }
        return $new;
    }
    

    用法很基础

    $array = multi_array($array);
    

    希望对你有帮助

    【讨论】:

    • 输出不符合预期。
    【解决方案4】:

    试试下面的代码:

    function makeOneDimensionArray(array $array, &$res = array())
    {
        foreach($array as $arr)
        {
            $res[] = array(
                'TASK_ID' => $arr['TASK_ID'],
                'PARENT_TASKID' => $arr['PARENT_TASKID']
            );
            if(isset($arr['children']))
            {
                makeOneDimensionArray($arr['children'], $res);
            }
    
        }
    
        return $res;
    
    }
    
    $finalArr = makeOneDimensionArray($array);
    
    print_r($finalArr);
    

    希望对你有帮助。

    【讨论】:

    • 代码接近预期。但我怀疑PARENT_TASKID = 0 是否有两个任务,它们将首先被排序,然后是孩子。请查看相关生成的数组。
    • @Slimshadddyyy :只需将 array_merge 语句放在 foreach 循环中。查看我的编辑。
    • 即使在foreach内部,输出也是一样的。请查看我的问题和生成的数组。它有两条记录为PARENT_TASKID = 0
    猜你喜欢
    • 1970-01-01
    • 2016-08-29
    • 1970-01-01
    • 1970-01-01
    • 2020-07-29
    • 2011-07-26
    • 2017-09-20
    • 1970-01-01
    • 2017-06-09
    相关资源
    最近更新 更多