【问题标题】:Organizing multi-dimensional array of inventory组织库存的多维数组
【发布时间】:2018-05-05 03:38:31
【问题描述】:

我需要帮助整理我的库存阵列。该结构是一个大库存数组,里面有一系列项目。每个项目数组包含以下内容: item、item_group、item_no 和数组已售出。 sold 由带有日期和数量的内部数组组成。现在,我无法为我需要的输出组织它。我会给你们输入和输出的样本。所以请检查一下,非常感谢。

$inventory 数组的示例部分

Array
(
[0] => Array
    (
        [item] => NK
        [item_group] => 5
        [sold] => Array
            (
                [0] => Array
                    (
                        [quantity] => 11
                        [date] => 2017-10-28
                    )
                [1] => Array
                    (
                        [quantity] => 1
                        [date] => 2017-10-29
                    )
            )
        [item_no] => 1
    )
[1] => Array
    (
        [item] => FL
        [item_group] => 5
        [sold] => Array
            (
                [0] => Array
                    (
                        [quantity] => 7
                        [date] => 2017-10-28
                    )
                [1] => Array
                    (
                        [quantity] => 2
                        [date] => 2017-10-29
                    )
            )
        [item_no] => 2
    )
[2] => Array
    (
        [item] => AD
        [item_group] => 5
        [sold] => Array
            (
                [0] => Array
                    (
                        [quantity] => 5
                        [date] => 2017-10-28
                    )
                [1] => Array
                    (
                        [quantity] => 3
                        [date] => 2017-10-29
                    )
            )
        [item_no] => 3
    )
[3] => Array
    (
        [item] => CV
        [item_group] => 5
        [sold] => Array
            (
                [0] => Array
                    (
                        [quantity] => 4
                        [date] => 2017-10-28
                    )
                [1] => Array
                    (
                        [quantity] => 6
                        [date] => 2017-10-29
                    )
            )
        [item_no] => 4
    )
[4] => Array
    (
        [item] => NB
        [item_group] => 5
        [sold] => Array
            (
                [0] => Array
                    (
                        [quantity] => 12
                        [date] => 2017-10-28
                    )
                [1] => Array
                    (
                        [quantity] => 4
                        [date] => 2017-10-29
                    )
            )
        [item_no] => 5
    )
[5] => Array
    (
        [item] => SP
        [item_group] => 5
        [sold] => Array
            (
                [0] => Array
                    (
                        [quantity] => 4
                        [date] => 2017-10-28
                    )
                [1] => Array
                    (
                        [quantity] => 6
                        [date] => 2017-10-29
                    )
            )
        [item_no] => 6
    )
[6] => Array
    (
        [item] => WB
        [item_group] => 5
        [sold] => Array
            (
                [0] => Array
                    (
                        [quantity] => 5
                        [date] => 2017-10-28
                    )
                [1] => Array
                    (
                        [quantity] => 2
                        [date] => 2017-10-29
                    )
            )
        [item_no] => 7
    )
[7] => Array
    (
        [item] => wny
        [item_group] => 12
        [sold] => Array
            (
                [0] => Array
                    (
                        [quantity] => 4
                        [date] => 2017-10-28
                    )
                [1] => Array
                    (
                        [quantity] => 6
                        [date] => 2017-10-29
                    )
            )
        [item_no] => 8
    )
[8] => Array
    (
        [item] => bs
        [item_group] => 12
        [sold] => Array
            (
                [0] => Array
                    (
                        [quantity] => 15
                        [date] => 2017-10-28
                    )
                [1] => Array
                    (
                        [quantity] => 2
                        [date] => 2017-10-29
                    )
            )
        [item_no] => 9
    )
[9] => Array
    (
        [item] => st
        [item_group] => 12
        [sold] => Array
            (
                [0] => Array
                    (
                        [quantity] => 16
                        [date] => 2017-10-29
                    )
            )
        [item_no] => 10
    )
[10] => Array
    (
        [item] => ayhtdws
        [item_group] => 12
        [sold] => Array
            (
                [0] => Array
                    (
                        [quantity] => 2
                        [date] => 2017-10-29
                    )
            )
        [item_no] => 11
    )
[11] => Array
    (
        [item] => sif
        [item_group] => 12
        [sold] => Array
            (
                [0] => Array
                    (
                        [quantity] => 3
                        [date] => 2017-10-29
                    )
            )
        [item_no] => 12
    )
[12] => Array
    (
        [item] => bb
        [item_group] => 12
        [sold] => Array
            (
                [0] => Array
                    (
                        [quantity] => 6
                        [date] => 2017-10-29
                    )
            )
        [item_no] => 13
    )
)

从那里,我想展示的是这样的。按日期升序分组。每件商品 => 售出数量

Array
(
[0] => Array
    (
        [date] => 2017-10-28
        [NK] => 11
        [FL] => 7
        [AD] => 5
        [CV] => 4
        [NB] => 12
        [SP] => 4
        [WB] => 5
        [wny] => 4
        [bs] => 15
    )
[1] => Array
    (
        [date] => 2017-10-29
        [NK] => 1
        [FL] => 2
        [AD] => 3
        [CV] => 6
        [NB] => 4
        [SP] => 6
        [WB] => 2
        [wny] => 6
        [bs] => 2
        [st] => 16
        [ayhtdws] => 2
        [sif] => 3
        [bb] => 6
    )
)

我花了将近 3 天的时间来解决这个问题,直到写这篇文章为止,我只能做到这一点

$result = array();
$dates = array();
foreach ($inventory as $key => $item) {
    foreach ($item['sold'] as $k => $v) {
        array_push($dates, $v['date']);
    }
}
$dates = array_unique($dates);
foreach($dates as $key => $value) {
    array_push($result, array('date' => $value));
}
foreach ($dates as $rkey => $rvalue) {
    foreach ($inventory as $key => $item) {
        foreach ($item['sold'] as $k => $v) {
            if ($v['date'] = $result[$key]['date']) {
                array_push($result[$key][$item['item']] = $v['quantity']);
            }
        }
    }
}
return $result;

这当然给了我这个悲伤的结果

Array
(
[0] => Array
    (
        [date] => 2017-10-28
        [NK] => 1
    )
[1] => Array
    (
        [date] => 2017-10-29
        [FL] => 2
    )
)

更糟糕的是,我们有一条关于圈复杂性的规则,我们应该最多只有 3 个循环/条件,每个循环/条件最多 3 个嵌套级别。并且整个组织不应该有任何用户创建的功能。

即使不遵守规则,我也无法弄清楚几天。对不起,如果问题很长。请帮忙:(

更新:var_export($inventory) 输出

array (
  0 => 
  array (
    'item' => 'NK',
    'item_group' => '5',
    'sold' => 
    array (
      0 => 
      array (
        'quantity' => '11',
        'date' => '2017-10-28',
      ),
      1 => 
      array (
        'quantity' => '1',
        'date' => '2017-10-29',
      ),
    ),
    'item_no' => '1',
  ),
  1 => 
  array (
    'item' => 'FL',
    'item_group' => '5',
    'sold' => 
    array (
      0 => 
      array (
        'quantity' => '7',
        'date' => '2017-10-28',
      ),
      1 => 
      array (
        'quantity' => '2',
        'date' => '2017-10-29',
      ),
    ),
    'item_no' => '2',
  ),
  2 => 
  array (
    'item' => 'AD',
    'item_group' => '5',
    'sold' => 
    array (
      0 => 
      array (
        'quantity' => '5',
        'date' => '2017-10-28',
      ),
      1 => 
      array (
        'quantity' => '3',
        'date' => '2017-10-29',
      ),
    ),
    'item_no' => '3',
  ),
  3 => 
  array (
    'item' => 'CV',
    'item_group' => '5',
    'sold' => 
    array (
      0 => 
      array (
        'quantity' => '4',
        'date' => '2017-10-28',
      ),
      1 => 
      array (
        'quantity' => '6',
        'date' => '2017-10-29',
      ),
    ),
    'item_no' => '4',
  ),
  4 => 
  array (
    'item' => 'NB',
    'item_group' => '5',
    'sold' => 
    array (
      0 => 
      array (
        'quantity' => '12',
        'date' => '2017-10-28',
      ),
      1 => 
      array (
        'quantity' => '4',
        'date' => '2017-10-29',
      ),
    ),
    'item_no' => '5',
  ),
  5 => 
  array (
    'item' => 'SP',
    'item_group' => '5',
    'sold' => 
    array (
      0 => 
      array (
        'quantity' => '4',
        'date' => '2017-10-28',
      ),
      1 => 
      array (
        'quantity' => '6',
        'date' => '2017-10-29',
      ),
    ),
    'item_no' => '6',
  ),
  6 => 
  array (
    'item' => 'WB',
    'item_group' => '5',
    'sold' => 
    array (
      0 => 
      array (
        'quantity' => '5',
        'date' => '2017-10-28',
      ),
      1 => 
      array (
        'quantity' => '2',
        'date' => '2017-10-29',
      ),
    ),
    'item_no' => '7',
  ),
  7 => 
  array (
    'item' => 'wny',
    'item_group' => '12',
    'sold' => 
    array (
      0 => 
      array (
        'quantity' => '4',
        'date' => '2017-10-28',
      ),
      1 => 
      array (
        'quantity' => '6',
        'date' => '2017-10-29',
      ),
    ),
    'item_no' => '8',
  ),
  8 => 
  array (
    'item' => 'bs',
    'item_group' => '12',
    'sold' => 
    array (
      0 => 
      array (
        'quantity' => '15',
        'date' => '2017-10-28',
      ),
      1 => 
      array (
        'quantity' => '2',
        'date' => '2017-10-29',
      ),
    ),
    'item_no' => '9',
  ),
  9 => 
  array (
    'item' => 'st',
    'item_group' => '12',
    'sold' => 
    array (
      0 => 
      array (
        'quantity' => '16',
        'date' => '2017-10-29',
      ),
    ),
    'item_no' => '10',
  ),
  10 => 
  array (
    'item' => 'ayhtdws',
    'item_group' => '12',
    'sold' => 
    array (
      0 => 
      array (
        'quantity' => '2',
        'date' => '2017-10-29',
      ),
    ),
    'item_no' => '11',
  ),
  11 => 
  array (
    'item' => 'sif',
    'item_group' => '12',
    'sold' => 
    array (
      0 => 
      array (
        'quantity' => '3',
        'date' => '2017-10-29',
      ),
    ),
    'item_no' => '12',
  ),
  12 => 
  array (
    'item' => 'bb',
    'item_group' => '12',
    'sold' => 
    array (
      0 => 
      array (
        'quantity' => '6',
        'date' => '2017-10-29',
      ),
    ),
    'item_no' => '13',
  ),
)

【问题讨论】:

  • 您可以安排数组以便我们复制粘贴它。就像现在一样,为了使代码运行,需要整理很多小东西。使用 var_export($arr) 并复制粘贴。
  • 只看NK元素,我不确定我理解,数量不应该是12,而不是11吗?
  • 28 号 11 号和 29 号 1 号。 @威廉
  • 嗨威廉。正如 Andreas 所说,在 2017-10-28,NK 仅售出 11 个。另外 1 个数量在 2017-10-29 日期排列
  • 是否必须完全符合您的预期结果?你能接受数组的键是日期吗?

标签: php arrays multidimensional-array associative-array


【解决方案1】:

我不知道这和Erwin的代码是不是差不多,但是我13小时前写了这段代码,不得不等待数组。

编辑;我已经测试了 Erwin 的代码,似乎我们已经接近匹配的代码。 他多循环一圈来得到日期,但它或多或少是一样的。

我循环数组和售出的子数组。
我将新数组键设为日期示例:

Echo $new['2017-10-28']['nk']; // 11

如果日期键尚未设置,我将创建它。

循环完成后,我使用 array_values 删除日期键,使数组看起来像:

Echo $new[0]['nk']; // 11

代码:

$new =[];

Foreach($inventory as $sub){
    Foreach($sub["sold"] as $sold){
        If (!isset($new[$sold["date"]]["date"])) $new[$sold["date"]]["date"] = $sold["date"];
        $new[$sold["date"]][$sub["item"]] =  $sold["quantity"];
    }
}
$new = array_values($new);
Var_dump($new);

https://3v4l.org/mGJSX

【讨论】:

    【解决方案2】:

    我已经完成了一些测试和解决方法,并提出了这个解决方案。我已经设法通过使用ksort()array_values()array_key_exists()来做到这一点。我首先使用日期作为数组键来包含在该日期售出的所有商品。然后,在收集所有项目后将其移入数组,然后重新编号数组。进一步的解释通过代码cmets给出

    // result array
    $result = array();
    
    // Loop for each item on inventory
    foreach ($inventory as $inv) {
        // Loop for each sold array
        foreach ($inv['sold'] as $item) {
            // date sold
            $date = $item['date'];
            // Check if date already exist in result array as key
            // If not, Create new array with key equal to date and push to result array
            if (!array_key_exists($date, $result)) {
                $result[$date] = array();
            }
            // Add array of item  =>  quantity to corresponding date array inside result array
            $result[$date][$inv['item']] = $item['quantity'];
        }
    }
    // From here you already have each item  =>  quantity sold inside each date array
    // e.g. $result = array( '2017-10-28'  =>  array('NK'  =>  '11', 'FL'  =>  '7', ...) );
    
    // Sort keys which are dates ascending
    ksort($result);
    // Loop to results and set
    foreach ($result as $key  =>  $value) {
        $result[$key]['date'] = $key;
    }
    // Renumber Keys
    $result = array_values($result);
    
    // Print result
    echo '<pre>';
    print_r($result);
    

    输出

    Array
    (
    [0] => Array
        (
            [NK] => 11
            [FL] => 7
            [AD] => 5
            [CV] => 4
            [NB] => 12
            [SP] => 4
            [WB] => 5
            [wny] => 4
            [bs] => 15
            [date] => 2017-10-28
        )
    
    [1] => Array
        (
            [NK] => 1
            [FL] => 2
            [AD] => 3
            [CV] => 6
            [NB] => 4
            [SP] => 6
            [WB] => 2
            [wny] => 6
            [bs] => 2
            [st] => 16
            [ayhtdws] => 2
            [sif] => 3
            [bb] => 6
            [date] => 2017-10-29
        )
    
    )
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-11-12
      • 2015-12-18
      • 1970-01-01
      • 2019-10-26
      • 1970-01-01
      • 1970-01-01
      • 2018-01-31
      相关资源
      最近更新 更多