【问题标题】:Spreading array values传播数组值
【发布时间】:2021-02-17 11:35:28
【问题描述】:

我有一个多维数组,我想根据下面添加的共享场景来传播它的数据,我尝试了几种方法,但它没有返回我期望的结果,我不分享我的源代码它没有帮助,也不适合分享。

注意:在生成新的数组年集和字母序号(A、B、C、D或...)时应考虑,.

这是我的数组:

array(
        array(["AF2021A"], ["AF2021B"], ["AF2020C"]), 
        array(["IR2022A","IR2021A"], ["IR2022B","IR2021B"], ["IR2022C","IR2021C"], ["IR2022D","IR2021D","IR2020D"]
        ));

我希望这个数组的结果如下:

第一维应该返回这个:

AF2020C - AF2021A 
AF2020C - AF2021B 
AF2021B - AF2021A

第二维度应该返回这个:

    IR2020D - IR2021A
    IR2020D - IR2021B
    IR2020D - IR2021C
    IR2020D - IR2021D
    IR2020D - IR2022A
    IR2020D - IR2022B
    IR2020D - IR2022C
    IR2020D - IR2022D

    IR2021A - IR2021B
    IR2021A - IR2021C
    IR2021A - IR2021D
    IR2021A - IR2022A
    IR2021A - IR2022B
    IR2021A - IR2022C
    IR2021A - IR2022D

    IR2021B - IR2021C
    IR2021B - IR2021D
    IR2021B - IR2022A
    IR2021B - IR2022B
    IR2021B - IR2022C
    IR2021B - IR2022D

    IR2021C - IR2021D
    IR2021C - IR2022A
    IR2021C - IR2022B
    IR2021C - IR2022C
    IR2021C - IR2022D

    IR2021D - IR2022A
    IR2021D - IR2022B
    IR2021D - IR2022C
    IR2021D - IR2022D

    IR2022A - IR2022B
    IR2022A - IR2022C
    IR2022A - IR2022D
    IR2022B - IR2022C
    IR2022B - IR2022D
    IR2022C - IR2022D

【问题讨论】:

    标签: php arrays sorting arraylist


    【解决方案1】:

    我会稍微忽略你的外部数组,我认为你可以解决这个问题。下面的代码似乎与您显示的结果相同。我正在将字符串写入另一个数组,我也不确定你真正的预期输出应该是什么。另外,我正在输出一个空项目,只是为了匹配您的间距,您可以根据需要删除它或应用逻辑。

    首先,我们需要对数组进行清理、去重(以防万一)和排序:

    function cleanArray(array $array): array
    {
        $clean = [];
        foreach ($array as $item) {
            array_push($clean, ...$item);
        }
    
        $clean = array_unique($clean);
        sort($clean);
        return $clean;
    }
    

    然后主函数遍历数组,取出第一项,循环剩余的并追加,然后重复直到只剩下一个。 switch/case 对于缺少或只有一项的边缘情况的任何业务逻辑由您决定。

    function processArray(array $array): array
    {
        $array = cleanArray($array);
        switch (count($array)) {
            case 0:
                // Edge case, not sure
                return [];
            case 1:
                // Edge case again, not sure
                return [];
            case 2:
                return [sprintf('%1%s - %2$s', $array[0], $array[1])];
            default:
                $ret = [];
                while (count($array) >= 2) {
                    $currentItem = array_shift($array);
                    foreach ($array as $item) {
                        $ret[] = sprintf('%1$s - %2$s', $currentItem, $item);
                    }
                    $ret[] = '';
                }
    
                return $ret;
        }
    }
    

    这也可以通过递归来完成,但有时,如果你能避免这种情况,它会容易得多。

    这可以通过以下方式进行测试:

    print_r(processArray([["IR2022A", "IR2021A"], ["IR2022B", "IR2021B"], ["IR2022C", "IR2021C"], ["IR2022D", "IR2021D", "IR2020D"]]));
    print_r(processArray([["AF2021A"], ["AF2021B"], ["AF2020C"]]));
    

    唯一似乎不匹配的是您的第一个示例中的第三行。我不明白BA 之前,是不是打错字了?

    【讨论】:

    • 谢谢哥们,帮了大忙,现在我必须为多次解雇实施它。
    猜你喜欢
    • 2021-03-02
    • 2022-10-15
    • 1970-01-01
    • 1970-01-01
    • 2016-06-24
    • 2013-09-19
    • 2020-05-05
    • 2023-03-21
    • 2018-04-08
    相关资源
    最近更新 更多