【问题标题】:How to create a nested combination of values from a list of arrays in PHP如何从 PHP 中的数组列表中创建嵌套的值组合
【发布时间】:2020-04-04 11:03:16
【问题描述】:

我有以下结构:

$arr = array(
    array('123', '456'),
    array('Red', 'Blue', 'Green'),
    array('Test1', 'Test2'),
);

我想以以下格式创建这些值的嵌套组合:

Array
(
    [123] => Array
        (
            [Red] => Array
                (
                     [Test1] => Null
                     [Test2] => Null
                )
            [Blue] => Array
                (
                     [Test1] => Null
                     [Test2] => Null
                )
            [Green] => Array
                (
                     [Test1] => Null
                     [Test2] => Null
                )
        )
    [456] => Array
        (
            [Red] => Array
                (
                     [Test1] => Null
                     [Test2] => Null
                )
            [Blue] => Array
                (
                     [Test1] => Null
                     [Test2] => Null
                )
            [Green] => Array
                (
                     [Test1] => Null
                     [Test2] => Null
                )
        )
)

输入数组可以有不同数量的数组和值。应该尊重元素的顺序。

我该如何存档?我很感激任何帮助!谢谢。

【问题讨论】:

  • 您自己尝试过吗?
  • 使用循环或数组遍历函数
  • 它是静态结构还是你的数组中可以有超过 3 个数组?

标签: php arrays algorithm


【解决方案1】:

更精确的版本可能会对您有所帮助

$newarray = array();

    foreach($arr[0] as $key=>$value){
        foreach($arr[1] as $key=>$value1){
            foreach($arr[2] as $key=>$value2){
                $newarray[$value][$value1][$value2] = 'Null';
            }
        }
    } 

输出将相同

    Array
(
    [123] => Array
        (
            [Red] => Array
                (
                    [Test1] => Null
                    [Test2] => Null
                )

            [Blue] => Array
                (
                    [Test1] => Null
                    [Test2] => Null
                )

            [Green] => Array
                (
                    [Test1] => Null
                    [Test2] => Null
                )

        )

    [456] => Array
        (
            [Red] => Array
                (
                    [Test1] => Null
                    [Test2] => Null
                )

            [Blue] => Array
                (
                    [Test1] => Null
                    [Test2] => Null
                )

            [Green] => Array
                (
                    [Test1] => Null
                    [Test2] => Null
                )

        )

    )

【讨论】:

  • 在你的前排没有钥匙的情况下更整洁。您将如何处理原始数组中可变数量的元素?
【解决方案2】:

注意:由于已经发布了答案,我将发布我的答案。但正如 cmets 中所述,您应该首先展示自己的尝试。下次请这样做!

您可以使用递归函数将第一个维度的键映射到下一个维度的结果,依此类推:

$arr = [
  ['123', '456'],
  ['Red', 'Blue', 'Green'],
  ['Test1', 'Test2']
];

function getCombinations(array $dimensions): array
{
  $combinations = [];
  $first_dimension = reset($dimensions) ?: [];

  foreach ($first_dimension as $value) {
    $combinations[$value] = count($dimensions) > 1 
      ? getCombinations(array_slice($dimensions, 1)) 
      : null;
  }

  return $combinations;
}

print_r(getCombinations($arr));

演示:https://3v4l.org/hEhEv

【讨论】:

  • 谢谢。这是一个很好的解决方案。
【解决方案3】:

请注意,作为示例,我没有为数据类型构建任何错误检查。您必须使用它来最适合您的用例。

对于解决您的问题的例程,首先,首先制作输入数组的最后一个索引的数组。然后我有另一个函数(makeArray),它会创建一个带有两个参数的数组,$make 和 $with。 makeArray,根据参数 $make 中每个数组索引的字符串值返回一个具有索引的数组。使用 makeArray 创建的数组的每个索引都分配了 $with 参数的值。

在我的 toStructural 函数根据输入数组的 lastIndex 创建第一个数组之后。它从最高索引到最低索引遍历输入数组。每次,它使用两个参数调用 makeArray 函数,即它当前所在的索引或输入数组,以及它已经作为输出的内容。然后将该值分配回输出变量。

把这想象成从下到上构建。

$arr = array(
    array('123', '456'),
    array('Red', 'Blue', 'Green'),
    array('Test1', 'Test2'),
);

function toStructural( $arr ){
    $output = [];
    $lastIndex = count($arr) - 1;

    for ($i = 0; $i < count($arr[$lastIndex]); $i++ ){
        $output[$arr[$lastIndex][$i]] = null;
    }

    for ($i = $lastIndex - 1; $i > -1; $i--){
        $output = makeArray($arr[$i],$output);
    }
    return $output;
}

function makeArray( $make, $with ){
    $output = [];
    for( $i = 0; $i < count($make); $i++ ){
        $output[$make[$i]] = $with;
    }
    return $output;
}

var_dump(toStructural($arr));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-02
    • 1970-01-01
    • 2020-11-01
    相关资源
    最近更新 更多