【问题标题】:PHP storing data into a multidimensional arrayPHP将数据存储到多维数组中
【发布时间】:2016-07-10 04:34:02
【问题描述】:

我有一个数组,其中第一项是类别的键,第二项是该类别的名称,第三项是子类别的键,第四项是其名称,第五项是子类别的键...我'想将数据存储到一个新数组中,其中键将携带层次结构。因此它看起来像这样:

$dat[$ar[1]] = $ar[2];
$dat[$ar[1]][$ar[3]] = $ar[4];
$dat[$ar[1]][$ar[3]][$ar[5]] = $ar[6];
$dat[$ar[1]][$ar[3]][$ar[5]][$ar[7]] = $ar[8];
etc.

$ar 的项目数和 $dat 的深度是固定的。如何编写for循环来实现上述行为?

【问题讨论】:

  • 您能否提供一些示例输入数据和一些预期的输出数据?
  • 您的$ar 是从0 开始的标量数组,而不是从1 开始的吗?还是一个实际的关联数组?是不是应该像$ar = array('color','blue','type','plant','flower','tulip') 或者更像$ar = array('1' => 'color', '2' => 'blue', '3' => 'blue', '4' => 'plant', '5' => 'plant', '6' => 'flower', '7' => 'flower', '8' => tulip')
  • 数组是从索引 1 开始的标量数组

标签: php arrays for-loop multidimensional-array


【解决方案1】:

我不认为确切的要求是可能的。考虑$dat[$ar[1]][$ar[3]] = $ar[4]$dat[$ar[1]] = array($ar[3] => $ar[4]) 相同。这意味着您尝试像这样分配$dat[$ar[1]] 两次:

$dat[$ar[1]] = $ar[2];
$dat[$ar[1]] = array($ar[3] => $ar[4]);

覆盖第一个值并使其毫无意义。也许你真正想要的是:

$dat[$ar[0]]['value'] = $ar[1];
$dat[$ar[0]][$ar[2]]['value'] = $ar[3];
$dat[$ar[0]][$ar[2]][$ar[4]]['value'] = $ar[5];
$dat[$ar[0]][$ar[2]][$ar[4]][$ar[6]]['value'] = $ar[7];

这也希望 'value' 永远不是您的 $ar 数组中用作键的值。为简单起见,我假设您使用的是基于 0 的标量数组,例如 $ar = array('color','blue','type','plant','flower','tulip') 然后试试这个:

$dat = array();
$pnt = &$dat;
$cnt = count($ar);
for ($key=0; $key < $cnt; $key+=2) {
    $value = $ar[$key];
    $pnt[$value]['value'] = $ar[$key + 1];  // we assign it to the key 'value' of the current array dimension
    $pnt = &$pnt[$value]; // we now point to the new array dimension
}
echo '<pre>';
print_r($dat);
echo '</pre>';

那么你的输出会是这样的:

Array
(
    [color] => Array
        (
            [value] => blue
            [type] => Array
                (
                    [value] => plant
                    [flower] => Array
                        (
                            [value] => tulip
                        )
                )
        )
)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-11-27
    • 2012-01-12
    • 2011-07-26
    • 2015-11-24
    • 2019-08-08
    • 2013-09-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多