PHP数组索引的存储,php – 从flat(子数组存储父数组的索引)重新创建数组到多维?...

我试图采用一个平面阵列并重新创建它,以便它是多维的.我一直在研究array_combine和array_merge,但我不确定其中任何一个会给我我希望的东西……

数组,以它的当前形式(这只是一个简化的例子):

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

)

)

)

我正在尝试创建一个多维数组,其中每个对象都是它父类的子数组.所以,在上面的例子中,我正在尝试输出:

Array

(

[0] => stdClass Object

(

[tid] => 31

[name] => Safeway

[children] => Array

(

[tid] => 32

[name] => Dairy

[children] => Array

(

[tid] => 33

[name] => Milk

)

)

)

)

解决方法:

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

如果您可以将它们设为真正的数组,那么这可能会这样做:

// 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' ] ];

}

}

有了这个,你可以通过id轻松找到项目:

$item = $multiArray[ $someId ];

为了得到一个孩子:

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

或所有孩子:

$children = $item[ 'children' ];

编辑

好的,我现在已经测试过了,添加一些缺少的分号后似乎工作正常.

标签:php,arrays,multidimensional-array

来源: https://codeday.me/bug/20191009/1875758.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值