【问题标题】:How to insert array elements as sub array like first element is the parent of second,second is the parent of third and so on?如何将数组元素作为子数组插入,例如第一个元素是第二个的父元素,第二个是第三个的父元素,依此类推?
【发布时间】:2018-06-12 02:43:17
【问题描述】:

我需要转换一个数组,就像 $data = array('Image','Thumbnail','size')$data= array('Image'=>array('Thumbnail'=>array('size'=>'test'))); 格式。 怎么可能? 我试过类似下面的东西。

$count= count($data);
$last = $count-1;
for($i=$count-2;$i>=0;$i--)
{
  $newArray[$data[$i]][$data[$last]]='test'; 
  $last=$i;

}

但它的输出为

Array(
[thumbnail] => Array
    (
        [type] => test
    )

[image] => Array
    (
        [thumbnail] => test
    ))

任何帮助将不胜感激。谢谢你:-)

【问题讨论】:

  • 从头开始!然后将每个条目放入它的数组中,保存并将其放入下一个(=上一个)项目中。
  • 我没听懂你:-(

标签: php arrays sub-array


【解决方案1】:

你可以使用这个,非常基本的逻辑:

$array = array('Image','Thumbnail','size', 'test');
$a = [];
$i = count($array)- 1;
$a[$array[$i-1]] = $array[$i];
--$i;
while($i >= 1 ) {
    $a[$array[$i-1]] = $a;
    unset($a[$array[$i]]);
    --$i;
}

【讨论】:

  • 使用do{}while() 循环和条件$i > 0,您的代码会更简单。
  • unset() 第一次不需要。所以使用 do while 将无济于事。
  • 我想到了do { $a = [$array[--$i] => $a]; } while($i > 0);,它几乎等同于你的代码。
  • 非常感谢您的帮助。它也有效 :-)
【解决方案2】:

您可以创建自己的方法来创建这样的结构,只需遍历数组并为每个元素创建一个内部子元素。

function createPath($array) {
    $result = [];
    $current = &$result;
    foreach ($array as $node) {
        $current[$node] = [];
        $current = &$current[$node];
    }
    return $result;
}

这也可以使用array_reduce 和一个反转数组来完成:(array_reduce doumentation, array_reverse documentation)

$result = array_reduce(array_reverse($array), function($carry, $element) {
       return [$element => $carry]; 
    }, []);

foreach 解决方案将构建从外部元素到最内部元素的结构,array_reduce 解决方案将构建从内部到外部元素的结构。

两种解决方案都将创建输出:

[
    'Image' => [
        'Thumbnail' => [
            'size' => []
        ]
    ]
]

如果您希望最内层的键包含另一个值而不是空数组,您可以将 array_reduce 进位的初始值更改为所需的值,或向 createPath 函数添加另一个参数,以添加此值作为最内在的关键。

【讨论】:

  • 第一个解决方案不起作用。但第二种解决方案确实有效,而且看起来很神奇!
  • @Phil 感谢您的提示。我忘记了我现在添加的第一个解决方案中的引用运算符。现在可以了。 running example
  • 干得好!从中学到很多。
  • 第一个解决方案似乎不起作用,但第二个解决方案很棒。非常感谢您的帮助@Philipp Maurer :-)
【解决方案3】:

您还有其他的考虑吗?

下面的代码就是这么做的:

<?php
$data = array('Image','Thumbnail','size');
$newArray[$data[0]][$data[1]][$data[2]]='test'; 
var_dump($newArray);

或者你可以像这样使用 for 循环:

<?php
$data = array('Image','Thumbnail','size');
$result=array();
for($i=(count($data)-1);$i>=0;$i--){
    if($i==(count($data)-1))
        $result[$data[$i]]='test';
    else{
        $result[$data[$i]]=$result;
        unset($result[$data[$i+1]]);
    }
}

【讨论】:

  • 他们希望动态而不是静态来传递密钥
  • 是的。我们可以很容易地使用它来生成动态代码。
猜你喜欢
  • 2022-11-16
  • 1970-01-01
  • 2022-11-12
  • 1970-01-01
  • 1970-01-01
  • 2020-12-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多