创建一个数组,将另一个多维数组的所有可能性重新组合

时间:2018-09-19 08:05:51

标签: php arrays laravel

我在转换数组时遇到困难,需要专业人士的帮助。

我有一个像这样的数组:

$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数组的方法。

原始数组是动态的(可以使用不同的标签名称提供更多选项),因此无论数组的大小还是标签的名称,我都需要能够工作的东西。

2 个答案:

答案 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);

?>