重新创建从平面(如父阵列的子阵列存储指数),以多维数组? [英] Recreate array from flat (where child arrays store index of parent array) to multidimensional?

查看:121
本文介绍了重新创建从平面(如父阵列的子阵列存储指数),以多维数组?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我试图把一个平面阵列,并重新创建它,这样它的多维的。我一直在寻找到array_combine和array_merge,但我不知道,无论是那些给我什么,我希望...

的阵列,在它的当前形式(这只是一个简单的例子):

 阵列

    [0] => stdClass的对象
        (
            [TID] => 31
            [名] =>西夫韦
            [家长] =>排列
                (
                    [0] => 0
                )        )    [1] => stdClass的对象
        (
            [TID] => 32
            [名] =>乳业
            [家长] =>排列
                (
                    [0] => 31
                )        )    [2] => stdClass的对象
        (
            [TID] => 33
            [名] =>牛奶
            [家长] =>排列
                (
                    [0] => 32
                )        )

我试图创建一个多维数组,其中的每个对象是它的一个子数组的父。因此,在上面的例子中,我试图输出:

 阵列

    [0] => stdClass的对象
        (
            [TID] => 31
            [名] =>西夫韦
            [儿童] =>排列
                (
                    [TID] => 32
                    [名] =>乳业
                    [儿童] =>排列
                        (
                            [TID] => 33
                            [名] =>牛奶
                        )
                )        )


解决方案

首先,你所展示的不是一个多维数组,而是一个StdClass对象的数组。

如果这是正常的跟大家做他们忠实地数组那么这可能做到这一点:

  //初始化结果数组
$ =多阵列阵列();//假设$项目是您当前的阵列
的foreach($项目为$项)
{
    //投一个StdClass数组
    $ objToArray =(阵列)$项目;    //如果此项目已经开始与当前项目进行合并
    $多阵列[$ objToArray ['TID'] =使用isset($多阵列[$ objToArray ['TID'])? $多阵列[$ objToArray ['TID'] + $ objToArray:$ objToArray;    的foreach($ objToArray ['父母']为$ parentId的)
    {
        //如果还不存在的父母,他们启动
        如果(!使用isset($多阵列[$ parentId的))
        {
            $多阵列[$ parentId的] =阵列(
                '孩子'=>阵列()
            );
        }        //引用该项目添加到患儿家长集合(效率)
        $多阵列[$ parentId的] ['孩子'] [$ objToArray ['TID'] =安培; $多阵列[$ objToArray ['TID'];
    }
}

有了这个,你可以很容易地找到ID与项目:

  $项目= $多阵列[$ someId];

和得到一个孩子:

  $子= $项目['孩子'] [$ someChildId];

或者所有的孩子:

  $孩子= $项目['孩子'];

修改结果
好了,现在我已经测试过它,它似乎增加了一些缺少分号后正常工作。

I am trying to take a flat array and recreate it so that it's multidimensional. I've been looking into array_combine and array_merge, but I'm not sure that either of those will give me what I'm hoping for...

The array, in it's current form (and this is just a simplified example):

Array
(
    [0] => stdClass Object
        (
            [tid] => 31
            [name] => Safeway
            [parents] => Array
                (
                    [0] => 0
                )

        )

    [1] => stdClass Object
        (
            [tid] => 32
            [name] => Dairy
            [parents] => Array
                (
                    [0] => 31
                )

        )

    [2] => stdClass Object
        (
            [tid] => 33
            [name] => Milk
            [parents] => Array
                (
                    [0] => 32
                )

        )
)

I'm trying to create a multidimensional array where each object is a subarray of it's parent. So, in the example above, I'm trying to output:

Array
(
    [0] => stdClass Object
        (
            [tid] => 31
            [name] => Safeway
            [children] => Array
                (
                    [tid] => 32
                    [name] => Dairy
                    [children] => Array
                        (
                            [tid] => 33
                            [name] => Milk
                        )
                )

        )
)

解决方案

First off, what you are showing is not an multidimensional array, but an array of StdClass objects.

If it's alright with you to make them truely arrays then this might do it:

// initiate result array
$multiArray = array();

// assume $items is your current array
foreach( $items as $item )
{
    // cast StdClass to array
    $objToArray = (array) $item;

    // if this item is initiated already merge it with the current item
    $multiArray[ $objToArray[ 'tid' ] ] = isset( $multiArray[ $objToArray[ 'tid' ] ] ) ? $multiArray[ $objToArray[ 'tid' ] ] + $objToArray : $objToArray;

    foreach( $objToArray[ 'parents' ] as $parentId )
    {
        // if parents don't exist yet, initiate them
        if( !isset( $multiArray[ $parentId ] ) )
        {
            $multiArray[ $parentId ] = array(
                'children' => array()
            );
        }

        // add this item to the parents children collection by reference (for efficiency)
        $multiArray[ $parentId ][ 'children' ][ $objToArray[ 'tid' ] ] = &$multiArray[ $objToArray[ 'tid' ] ];
    }
}

With this you can easily find items by id with:

$item = $multiArray[ $someId ];

And to get a child:

$child = $item[ 'children' ][ $someChildId ];

Or all children:

$children = $item[ 'children' ];

EDIT
Ok, I've tested it now, and it seems to work fine after adding some missing semicolons.

这篇关于重新创建从平面(如父阵列的子阵列存储指数),以多维数组?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆