php - 如何从未知数量的数组 PHP 中构建一个数组 [字符串]
问题描述
我怀疑这是正确的方法。
怎么了?
您为方法提供任意数量的数组...
[
'jupiter',
'saturn',
]
[
'is',
'was',
]
[
'old',
'big',
'loved',
]
并创造...
[
'jupiter is big',
'jupiter is loved',
'jupiter is old',
'jupiter was big',
'jupiter was loved',
'jupiter was old',
'saturn is big',
'saturn is loved',
'saturn is old',
'saturn was big',
'saturn was loved',
'saturn was old',
]
你应该怎么做?
Stackoverflow 喜欢尝试,所以给你
我的方法目前有两个循环函数(带有嵌套的 for 循环)和十几个其他 for 循环之间不是你想象的最快的方法来实现这一点。我确实首先尝试使用聪明的数学,但开始让自己感到困惑。如果您有更好的解决方案,请您也解释一下!
感谢您的时间。
这是我的工作代码:
<?php
function generateList(...$arrays)
{
// Use first array to generate a starting point
$result = [...array_map(function($item){return [$item => []];}, $arrays[0])];
// Adds a new keyed array to the end of every existing empty array
function addToEndChild($object, $string){
if (is_array($object) && count($object) == 0){
return [$string => []];
}
foreach ($object as $index => $item){
$object[$index] = addToEndChild($item, $string);
}
return $object;
};
// Flattens array back down using the keys as values
function flatten($array, $prefix = '', $depth = 0) {
$result = [];
foreach($array as $key => $value) {
if (is_int($key) == false){
$result[] = $key;
}
$flat = flatten($value, $prefix . $key . '.', $depth + 1);
$result = array_merge($result, $depth == 0 ? [$flat] : $flat);
}
return $result;
}
// Loop through remaining arrays and build up nested array
foreach (array_slice($arrays, 1) as $array){
$layer = [];
foreach ($array as $item){
$layer[] = addToEndChild($result, $item);
}
$result = array_merge(...$layer);
}
// Flatten down
$finalResult = flatten($result);
// Convert layers into strings
foreach ($finalResult as $index => $item){
$finalResult[$index] = implode(' ', $item);
}
// Sort alphabetically
asort($finalResult);
return $finalResult;
}
$a = [
'jupiter',
'saturn',
];
$b = [
'is',
'was',
];
$c = [
'old',
'big',
'loved',
];
var_dump(generateList($a, $b, $c));
解决方案
这是我只有一个递归函数的代码。它也将矩阵作为参数而不是 N 个数组。
function generateList($data){
if (count($data) == 0){
return null;
}
$current = $data[0];
$left = array_slice($data, 1);
$permutations = generateList($left);
$r = [];
foreach($current as $item){
if ($permutations){
foreach ($permutations as $rest) {
$r[] = $item . ' ' . $rest;
}
}
else {
$r[] = $item;
}
}
return $r;
}
$data = [
['jupiter', 'saturn'],
['is', 'was'],
['old', 'big', 'loved']
];
var_dump(generateList($data));
推荐阅读
- actionscript-3 - AS3 如何根据用户用鼠标画线的位置找到贝塞尔曲线的控制点
- javascript - 角度对象破坏中的Datatable js并且没有发生数据刷新
- java - 如何使用 XMLHttpRequest 从 Java 服务器接收压缩的 JSON 数据
- react-redux - Redux-Saga 不运行
- c# - 为 ASP.NET Core / EF Core / xUnit.NET 集成测试中的每个测试播种测试数据
- android - 如何在列表视图和滚动视图的末尾关闭波浪动画
- git - Git 是否会在克隆上带来未提交的更改?
- python-3.x - 更优化的解决方案
- ruby - 在父类方法实现的代码之间插入来自子类方法实现的代码
- javascript - 如何通过 Puppeteer 获取父子元素?