首页 > 解决方案 > PHP - 从数组中获取组合

问题描述

我需要一个建议,如何从以下源创建树视图。

$dataSrc = array(
 '1@02@43@170@1',
 '1@02@43@176@1',
 '1@02@43@182@1',
 '1@02@42@182@1',
 '1@02@42@176@1',
);

此字符串是产品的分组变体。每个参数由@分隔。因此,如果我炸开这些琴弦,我会得到这些。

Array
(
    [0] => Array
        (
            [0] => 1
            [1] => 02
            [2] => 43
            [3] => 170
            [4] => 1
        )

    [1] => Array
        (
            [0] => 1
            [1] => 02
            [2] => 43
            [3] => 176
            [4] => 1
        )

    [2] => Array
        (
            [0] => 1
            [1] => 02
            [2] => 43
            [3] => 182
            [4] => 1
        )

    [3] => Array
        (
            [0] => 1
            [1] => 02
            [2] => 42
            [3] => 182
            [4] => 1
        )

    [4] => Array
        (
            [0] => 1
            [1] => 02
            [2] => 42
            [3] => 176
            [4] => 1
        )

)

现在我需要获取参数的组合,这是不一样的。结果应该是:

$resp = array(
  43 => array(
     170,
     176,
     182,
    ),
  42 => array(
     182,
     176,
   )
);

所以取消设置的键,它们是相同的并且从组合中获取树。你能帮我吗?

其他详细信息(根据 OP 的评论编辑成问题——其中一些已被删除):

这些字符串 (1@02@43@170@1) 是产品的组合变体(从外部数据库返回) 1 - 一些参数 02 - 颜色 43 - sizeA 178 - sizeB 每个产品都有特定组合,这些组合由这些声明字符串。因此,如果我有 1@02@43@170@1 和 1@02@43@176@1,这意味着我有尺寸为 43 的产品,而尺寸为 43 的产品我还有另一个变体 176 和 170。这真的很难解释,但我需要将这些值分组。

我不知道哪些值不同。首先,我需要知道需要对哪些参数进行分组(例如可以是两个或三个参数)。

如果值相同,则不应分组。如果会有 3 个不同的值,应该是这样的: $final = array( '02' => array( 42 => array( 170, 176, ), 43 => array( 182, 176, ), ), '03' => 数组(42 => 数组(170、176、)、));

它应该是分层分组的,所以首先在父级别有不同的值。

另一个可能的样本集:

$dataSrc2 = array(
    '1@02@43@170@1',
    '1@02@43@176@1',
    '1@02@43@182@1',
    '1@02@42@182@1',
    '1@02@42@176@1',
    '1@03@43@170@1',
    '1@03@43@176@1',
    '1@03@43@182@1',
    '1@03@42@182@1',
    '1@03@42@176@1',
);

标签: phparraystreeview

解决方案


在将 - 分隔的字符串数组解析为@具有已知深度的嵌套结构后,您正在寻找一个深度未知的精益输出数组,其中顶层有多个条目。

为了实现这一点,我下面的代码会将字符串解析为深度有限的数组结构,然后如果只有一个条目,则递归剥离顶层。结果数组将是一个空数组(如果所有字符串都相同),或者它将具有包含多个条目的顶级。

代码:(3 个样本集的演示

function killYourParentIfYouHaveOne($level) {
    if (count($level) === 1) {
         $key = key($level);
         $level = is_array($level[$key]) ? killYourParentIfYouHaveOne($level[$key]) : [];
    }
    return $level;
}

function differingTree(array $array): array {
    $result = [];
    foreach ($array as $item) {
        [$a, $b, $c, $d, $e] = explode('@', $item, 5);
        $result[$a][$b][$c][$d] = $e;
    }
    return killYourParentIfYouHaveOne($result);
}

foreach ($tests as $test) {
    echo var_export(differingTree($test), true) . "\n---\n";
}

样本输入:

$tests = [
    [
        '1@02@43@170@1',
        '1@02@43@176@1',
        '1@02@43@182@1',
        '1@02@42@182@1',
        '1@02@42@176@1',
    ],
    [
        '1@02@43@170@1',
        '1@02@43@176@1',
        '1@02@43@182@1',
        '1@02@42@182@1',
        '1@02@42@176@1',
        '1@03@43@170@1',
        '1@03@43@176@1',
        '1@03@43@182@1',
        '1@03@42@182@1',
        '1@03@42@176@1',
    ],
    [
        '1@02@43@170@1',
        '1@02@43@170@1',
    ]
];

生成的输出:

array (
  43 => 
  array (
    170 => '1',
    176 => '1',
    182 => '1',
  ),
  42 => 
  array (
    182 => '1',
    176 => '1',
  ),
)
---
array (
  '02' => 
  array (
    43 => 
    array (
      170 => '1',
      176 => '1',
      182 => '1',
    ),
    42 => 
    array (
      182 => '1',
      176 => '1',
    ),
  ),
  '03' => 
  array (
    43 => 
    array (
      170 => '1',
      176 => '1',
      182 => '1',
    ),
    42 => 
    array (
      182 => '1',
      176 => '1',
    ),
  ),
)
---
array (
)
---

推荐阅读