php - 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',
);
解决方案
在将 - 分隔的字符串数组解析为@
具有已知深度的嵌套结构后,您正在寻找一个深度未知的精益输出数组,其中顶层有多个条目。
为了实现这一点,我下面的代码会将字符串解析为深度有限的数组结构,然后如果只有一个条目,则递归剥离顶层。结果数组将是一个空数组(如果所有字符串都相同),或者它将具有包含多个条目的顶级。
代码:(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 (
)
---
推荐阅读
- powershell - PowerShell 如果下一行包含“此字符串”,则输出当前行和下 3 行,否则仅输出当前行
- angular - 为什么行在 angular7 中的表单输入中没有更新?
- c# - 如何控制 DatePicker 高度?
- hl7 - nHapi 向 REFI12 消息添加非标准段
- amazon-web-services - 使用亚马逊 SQS 向消费者 URL 推送通知
- netsuite - 将 SuiteScript 2.0 转换为 1.0
- php - Twitter API:被阻止在 PHP 中检索用户信息?
- css - 获取不同深浅的自定义材质 UI 主题原色?
- sql-server - 将 CSV 文件从 Azure Blob 存储批量插入 SQL 托管实例
- visual-studio-code - 为什么我仍然需要为每个单独的项目安装 prettier,而它已经作为扩展安装在 vs code 中?