Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/272.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 操纵多维数组的结构_Php_Arrays - Fatal编程技术网

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。但两者都是正确的。