代码之家  ›  专栏  ›  技术社区  ›  Harun Anwar

如何从一维数组创建具有关联子数组的数组?

  •  0
  • Harun Anwar  · 技术社区  · 6 年前

    我有以下数组。

    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
        ) )
    

    现在请帮我做这个。 提前谢谢。

    2 回复  |  直到 6 年前
        1
  •  1
  •   arkascha    6 年前

    你可以简化很多:

    <?php
    // ...
    $dataArrMaterial = [];
    foreach ($materials as $materialName => $materialQty) {
        $dataArrMaterial[] = [
            "material_name" => $materialName ,
            "material_qty" => $materialQty
        ];
    }
    
        2
  •  0
  •   mickmackusa Tom Green    6 年前

    因为没有向你解释 为什么? ,我会的。

    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
    }
    

    $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 )增量 一美元 而“覆盖”过程对 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演示的方式来执行。