我在转换数组时遇到困难,需要专业人士的帮助。
我有一个像这样的数组:
$inputs = array(
'size' => array(
's' => 's',
'm' => 'm',
'l' => 'l',
),
'color' => array(
'red' => 'red',
'blue' => 'blue',
),
'option' => 'option 1',
);
根据这个值,我需要创建一个结合所有可能性的数组,像这样:
$possibilities = array(
0 => array('size' => 's', 'color' => 'red', 'option' => 'option 1'),
1 => array('size' => 'm', 'color' => 'red', 'option' => 'option 1'),
2 => array('size' => 'l', 'color' => 'red', 'option' => 'option 1'),
3 => array('size' => 's', 'color' => 'blue', 'option' => 'option 1'),
4 => array('size' => 'm', 'color' => 'blue', 'option' => 'option 1'),
5 => array('size' => 'l', 'color' => 'blue', 'option' => 'option 1'),
);
我精确地说,我在laravel上,所以我可以使用collection methods,但是即使有了这种辅助方法,我也找不到找到所需的$possibilities
数组的方法。
原始数组是动态的(可以使用不同的标签名称提供更多选项),因此无论数组的大小还是标签的名称,我都需要能够工作的东西。
答案 0 :(得分:0)
$output = array();
foreach($inputs['size'] as $size)
{
foreach($inputs['colour'] as $colour)
{
foreach($inputs['option'] as $option)
{
$output[] = array('size' => $size, 'colour' => $colour, 'option' => $option);
}
}
}
return $output;
Update :
$collection = collect($inputs[0]);
array_shift($inputs);
$matrix = $collection->crossJoin($inputs);
$matrix->all();
Update :
$collection = collect(array_shift($inputs));
$matrix = $collection->crossJoin($inputs);
$matrix->all();
Update :
use this function
function combinations($arrays, $i = 0) {
if (!isset($arrays[$i])) {
return array();
}
if ($i == count($arrays) - 1) {
return $arrays[$i];
}
// get combinations from subsequent arrays
$tmp = combinations($arrays, $i + 1);
$result = array();
// concat each array from tmp with each element from $arrays[$i]
foreach ($arrays[$i] as $v) {
foreach ($tmp as $t) {
$result[] = is_array($t) ?
array_merge(array($v), $t) :
array($v, $t);
}
}
return $result;
}
答案 1 :(得分:0)
请尝试一下,希望对您有所帮助。
<?php
$inputs = array(
'size' => array(
's' => 's',
'm' => 'm',
'l' => 'l',
),
'color' => array(
'red' => 'red',
'blue' => 'blue',
),
'option' => 'option 1',
);
$combinations = [[]];
$length = count($inputs);
foreach (array_keys($inputs) as $key) {
$tmp = [];
foreach ($combinations as $v1) {
if (is_array($inputs[$key])) {
foreach ($inputs[$key] as $v2) {
$tmp[] = array_merge($v1, [$key => $v2]);
}
} else {
$tmp[] = array_merge($v1, [$key => $inputs[$key]]);
}
}
$combinations = $tmp;
}
echo "<pre>";
print_r($combinations);
?>