【问题标题】:How to create an array with associative subarrays from a one-dimensional array? [duplicate]如何从一维数组创建具有关联子数组的数组? [复制]
【发布时间】:2018-09-07 07:50:30
【问题描述】:

我有以下数组。

Array(
[1041] => 30
[1046] => 10
[1047] => 10
)

我想像下面这样存储它。

Array([0] => Array
(
    [material_name] => 1041
    [material_qty] => 30
) 
[1] => Array
(
    [material_name] => 1046
    [material_qty] => 10
)
[2] => Array
(
    [material_name] => 1047
    [material_qty] => 10
) )

现在我正在尝试存储键值,但它只存储最后一个。

for($i=0; $i<count($materials); $i++){
              foreach($materials as $key => $value){
                 $dataArrMaterial[$i] = array(
                        'material_name' => $key,
              'material_qty' => $value
                         );
              } }
              _print($dataArrMaterial);

我的输出如下。

Array(
[0] => Array
    (
        [material_name] => 1047
        [material_qty] => 10
    )

[1] => Array
    (
        [material_name] => 1047
        [material_qty] => 10
    )

[2] => Array
    (
        [material_name] => 1047
        [material_qty] => 10
    ) )

现在请帮助我做到这一点。 提前致谢。

【问题讨论】:

  • 你能命名变量吗?你把 print_r 输出,但我们必须猜测它是否是 $materials...。您应该将 PHP 数组声明易于复制粘贴和重现
  • 更改:foreach($materials as $key => $value){ 到 foreach($materials[$i] as $key => $value){

标签: php arrays multidimensional-array associative-array


【解决方案1】:

你可以简化很多:

<?php
// ...
$dataArrMaterial = [];
foreach ($materials as $materialName => $materialQty) {
    $dataArrMaterial[] = [
        "material_name" => $materialName ,
        "material_qty" => $materialQty
    ];
}

【讨论】:

    【解决方案2】:

    既然没有向你解释为什么,我会的。

    for($i=0; $i<count($materials); $i++){
        foreach($materials as $key => $value){
            // the value of $i is not changed within this loop
            $dataArrMaterial[$i] = array('material_name' => $key, 'material_qty' => $value);
        }
        // when the for() loop starts again, $i is incremented
    }
    

    因此,在 foreach 循环的第一次迭代中,您将所有子数组分配给相同的 $i 键 (0)。 1041 循环后,你的输出数组如下所示:

    [0 => ["material_name" => 1041, "material_qty" => 30]];
    

    1046 之后,第一个推送的子数组被覆盖,因为同一级别的键必须是唯一的。

    [0 => ["material_name" => 1046, "material_qty" => 10]];
    

    然后第三个元素覆盖输出数组中的第二个:

    [0 => ["material_name" => 1047, "material_qty" => 10]];
    

    一旦内循环 (foreach) 完成,外循环 (for) 会递增 $i,并且对于输出数组的 1 键重复“覆盖”过程。然后又是因为count($materials) = 3(三个迭代)。

    这就是为什么你会得到像这样重复的最后一组值:

    [0 => ["material_name" => 1047, "material_qty" => 10]];
    [1 => ["material_name" => 1047, "material_qty" => 10]];
    [2 => ["material_name" => 1047, "material_qty" => 10]];
    

    至于执行此任务的最佳方式,您可以使用我的重复链接中的解决方案,或者按照 Arkascha 的演示进行操作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-29
      • 1970-01-01
      • 2013-08-31
      • 1970-01-01
      相关资源
      最近更新 更多