首页 > 解决方案 > 将多维数组转换为平面数组php

问题描述

我在将多维数组转换为平面数组时遇到问题我有一个这样的输入数组:

Array
(
    [0] => Array
        (
            [type] => MagentoCatalogRuleModelRuleConditionCombine
            [aggregator] => all
            [conditions] => Array
                (
                    [0] => Array
                        (
                            [type] => MagentoCatalogRuleModelRuleConditionProduct
                            [attribute] => category_ids
                        )
                )
        )

    [1] => Array
        (
            [type] => MagentoCatalogRuleModelRuleConditionProduct
            [attribute] => category_ids
        )

    [2] => Array
        (
            [type] => MagentoCatalogRuleModelRuleConditionProduct
            [attribute] => attribute_set_id
        )
)

我希望输出是这样的数组,子数组将被展平为父数组级别,并且将被索引识别:

Array
(
    [1--1] => Array
        (
            [type] => Magento\CatalogRule\Model\Rule\Condition\Combine
            [aggregator] => all
        )

    [1--1--1] => Array
        (
            [type] => Magento\CatalogRule\Model\Rule\Condition\Product
            [attribute] => category_ids
        )

    [1--2] => Array
        (
            [type] => Magento\CatalogRule\Model\Rule\Condition\Product
            [attribute] => category_ids
        )

    [1--3] => Array
        (
            [type] => Magento\CatalogRule\Model\Rule\Condition\Product
            [attribute] => attribute_set_id
        )
)

输入数组可能包含许多子层,输出数组必须是该格式的索引。我坚持将此逻辑写入代码。谢谢!

标签: phparraysmultidimensional-arraymagento2

解决方案


您可以使用这样的递归函数:

function flatten($array, $parent_key = '1') {
  $flattened_array = [];
  foreach ($array as $key => $item) {
    $tmp = $item;
    unset($tmp['conditions']);
    $child_key = $parent_key . '--' . strval($key + 1);
    $flattened_array[$child_key] = $tmp;
    if (isset($item['conditions'])) {
      $flattened_array = array_merge($flattened_array, flatten($item['conditions'], $child_key));
    }
  }
  return $flattened_array;
}

$input = [
  0 => [
    'type' => 'MagentoCatalogRuleModelRuleConditionCombine',
    'aggregator' => 'all',
    'conditions' => [
      0 => [
        'type' => 'MagentoCatalogRuleModelRuleConditionProduct',
        'attribute' => 'category_ids'
      ]
    ]
  ],

  1 => [
    'type' => 'MagentoCatalogRuleModelRuleConditionProduct',
    'attribute' => 'category_ids'
  ],

  2 => [
    'type' => 'MagentoCatalogRuleModelRuleConditionProduct',
    'attribute' => 'attribute_set_id'
  ]
];

print_r(flatten($input));

输出:

Array
(
    [1--1] => Array
        (
            [type] => MagentoCatalogRuleModelRuleConditionCombine
            [aggregator] => all
        )

    [1--1--1] => Array
        (
            [type] => MagentoCatalogRuleModelRuleConditionProduct
            [attribute] => category_ids
        )

    [1--2] => Array
        (
            [type] => MagentoCatalogRuleModelRuleConditionProduct
            [attribute] => category_ids
        )

    [1--3] => Array
        (
            [type] => MagentoCatalogRuleModelRuleConditionProduct
            [attribute] => attribute_set_id
        )

)

推荐阅读