Php 操纵多维数组的结构
这实际上是一个我已经解决的问题,但我怀疑可能有更好的解决方案。我有一个嵌套数组,它基本上表示类别树中所有节点的列表(没有特定顺序): 您会注意到,Php 操纵多维数组的结构,php,arrays,Php,Arrays,这实际上是一个我已经解决的问题,但我怀疑可能有更好的解决方案。我有一个嵌套数组,它基本上表示类别树中所有节点的列表(没有特定顺序): 您会注意到,$node['Child']在所有实例中都是空数组。这是因为我已经使用了array\u filter()来过滤掉所有非叶节点。尽管如此,我最终还是希望有一个一维叶节点数组,如下所示: Array( [49] => Poster [48] => Sticker [46] => Hat [45] =>
$node['Child']
在所有实例中都是空数组。这是因为我已经使用了array\u filter()
来过滤掉所有非叶节点。尽管如此,我最终还是希望有一个一维叶节点数组,如下所示:
Array(
[49] => Poster
[48] => Sticker
[46] => Hat
[45] => Hoodie
)
那么,将第一个数组转换为第二个数组的最优雅方式是什么呢
(可选)也可以从叶节点和非叶节点的数组开始,尝试修剪数组并重新构造它。非叶节点的示例如下:
[7] => Array(
[Category] => Array(
[id] => 36
[name] => Merch
)
[Child] => Array(
[0] => Array(
[id] => 49
[name] => Poster
)
[1] => Array(
[id] => 48
[name] => Sticker
)
[2] => Array(
[id] => 40
[name] => Apparel
)
)
)
最后,我使用的是CakePHP,所以也可以使用CakePHP的
Set
类?定义优雅。我认为有些人会把这变成一场高尔夫比赛,而不是简单地做一些有意义的事情,这一点在以后的代码中对任何人来说都是显而易见的:
$cats = array();
foreach($categories as $c) {
$cats[$c['Category']['id']] = $c['Category']['name'];
}
我怀疑这就是你所拥有的,在这种情况下,我建议你拍拍自己的后背,继续前进。优雅?定义优雅。我认为有些人会把这变成一场高尔夫比赛,而不是简单地做一些有意义的事情,这一点在以后的代码中对任何人来说都是显而易见的:
$cats = array();
foreach($categories as $c) {
$cats[$c['Category']['id']] = $c['Category']['name'];
}
我怀疑这就是你所拥有的,在这种情况下,我建议你拍拍自己的后背,继续前进。这个答案无论如何都不是为了“优雅”,但我想它可能属于“聪明”的范畴。(注意:聪明的解决方案并不总是“好”的解决方案) 老实说,递归迭代是清晰的最佳选择,即使它不是非常有效或简洁
$arr = array(
"0" => array(
"Category" => array(
"id" => 49
,"name" => Poster
)
,"Child" => array()
)
,"1" => array(
"Category" => array(
"id" => 48
,"name" => Sticker
)
,"Child" => array()
)
,"2" => array(
"Category" => array(
"id" => 46
,"name" => Hat
)
,"Child" => array()
)
,"3" => array(
"Category" => array(
"id" => 45
,"name" => Hoodie
)
,"Child" => array(
"0" => array(
"id" => 49
,"name" => Poster
)
,"1" => array(
"id" => 48
,"name" => Sticker
)
,"2" => array(
"id" => 40
,"name" => Apparel
)
)
)
);
findNames( $arr, $names );
echo '<pre>';
print_r( $names );
echo '</pre>';
function findNames( $source, &$out )
{
foreach ( $source as $value )
{
if ( isset( $value['name'] ) )
{
// Assumes that if $value['name'] exists, $value['id'] must also exist
$out[$value['id']] = $value['name'];
continue;
}
if ( is_array( $value ) )
{
findNames( $value, &$out );
}
}
}
$arr=array(
“0”=>数组(
“类别”=>数组(
“id”=>49
,“名称”=>海报
)
,“子”=>数组()
)
,“1”=>数组(
“类别”=>数组(
“id”=>48
,“名称”=>贴纸
)
,“子”=>数组()
)
,“2”=>阵列(
“类别”=>数组(
“id”=>46
,“name”=>帽子
)
,“子”=>数组()
)
,“3”=>阵列(
“类别”=>数组(
“id”=>45
,“name”=>连帽衫
)
,“子”=>数组(
“0”=>数组(
“id”=>49
,“名称”=>海报
)
,“1”=>数组(
“id”=>48
,“名称”=>贴纸
)
,“2”=>阵列(
“id”=>40
,“名称”=>服装
)
)
)
);
findNames($arr,$name);
回声';
打印(姓名);
回声';
函数findNames($source,&$out)
{
foreach($source作为$value)
{
如果(isset($value['name']))
{
//假设如果$value['name']存在,$value['id']也必须存在
$out[$value['id']=$value['name'];
继续;
}
if(是_数组($value))
{
findNames($value,&$out);
}
}
}
这个答案无论如何都不是为了“优雅”,但我想它可能属于“聪明”一类。(注意:聪明的解决方案并不总是“好”的解决方案)
老实说,递归迭代是清晰的最佳选择,即使它不是非常有效或简洁
$arr = array(
"0" => array(
"Category" => array(
"id" => 49
,"name" => Poster
)
,"Child" => array()
)
,"1" => array(
"Category" => array(
"id" => 48
,"name" => Sticker
)
,"Child" => array()
)
,"2" => array(
"Category" => array(
"id" => 46
,"name" => Hat
)
,"Child" => array()
)
,"3" => array(
"Category" => array(
"id" => 45
,"name" => Hoodie
)
,"Child" => array(
"0" => array(
"id" => 49
,"name" => Poster
)
,"1" => array(
"id" => 48
,"name" => Sticker
)
,"2" => array(
"id" => 40
,"name" => Apparel
)
)
)
);
findNames( $arr, $names );
echo '<pre>';
print_r( $names );
echo '</pre>';
function findNames( $source, &$out )
{
foreach ( $source as $value )
{
if ( isset( $value['name'] ) )
{
// Assumes that if $value['name'] exists, $value['id'] must also exist
$out[$value['id']] = $value['name'];
continue;
}
if ( is_array( $value ) )
{
findNames( $value, &$out );
}
}
}
$arr=array(
“0”=>数组(
“类别”=>数组(
“id”=>49
,“名称”=>海报
)
,“子”=>数组()
)
,“1”=>数组(
“类别”=>数组(
“id”=>48
,“名称”=>贴纸
)
,“子”=>数组()
)
,“2”=>阵列(
“类别”=>数组(
“id”=>46
,“name”=>帽子
)
,“子”=>数组()
)
,“3”=>阵列(
“类别”=>数组(
“id”=>45
,“name”=>连帽衫
)
,“子”=>数组(
“0”=>数组(
“id”=>49
,“名称”=>海报
)
,“1”=>数组(
“id”=>48
,“名称”=>贴纸
)
,“2”=>阵列(
“id”=>40
,“名称”=>服装
)
)
)
);
findNames($arr,$name);
回声';
打印(姓名);
回声';
函数findNames($source,&$out)
{
foreach($source作为$value)
{
如果(isset($value['name']))
{
//假设如果$value['name']存在,$value['id']也必须存在
$out[$value['id']=$value['name'];
继续;
}
if(是_数组($value))
{
findNames($value,&$out);
}
}
}
这些内容是否可能是以XML形式产生的?不,这只是CakePHP为数据库查询提供的数据结构。这些内容是否可能是以XML形式产生的?不,这只是CakePHP为数据库查询提供的数据结构。简单的解决方案通常是最好的。你可以用for代替foreach。但两者都是正确的。简单的解决方案往往是最好的。你可以用for代替foreach。但两者都是正确的。