【问题标题】:2 arrays, find every permutation2个数组,找到每个排列
【发布时间】:2013-09-06 19:45:09
【问题描述】:

我有很多作为产品选项的数组(示例如下):

$option_array[] = array(
    "name" => "delivery",
    "options" => array(
        "sat", "sun")
);
$option_array[] = array(
    "name" => "colour",
    "options" => array(
        "red", "blue", "green")
);
$option_array[] = array(
    "name" => "size",
    "options" => array(
        "small", "medium", "large")
);

什么是我想出每个排列作为一个 foreach 循环但相当有效的最佳方式。我需要在数据库中为每个可能的组合输入一个值(在这个例子中应该是 18 个值或 18 次迭代)。如何获得结果排列的数组?

预期输出:

array(18){
    [0] => array(3){
        "delivery" => "sat",
        "colour" => "red",
        "size" => "small",
    }
    [1] => array(3){
        "delivery" => "sat",
        "colour" => "red",
        "size" => "medium",
    }
    [2] => array(3){
        "delivery" => "sat",
        "colour" => "red",
        "size" => "large",
    }
    [3] => array(3){
        "delivery" => "sat",
        "colour" => "blue",
        "size" => "small",
    }
    [4] => array(3){
        "delivery" => "sat",
        "colour" => "blue",
        "size" => "medium",
    }
    [5] => array(3){
        "delivery" => "sat",
        "colour" => "blue",
        "size" => "large",
    }
    [6] => array(3){
        "delivery" => "sat",
        "colour" => "green",
        "size" => "small",
    }
    [7] => array(3){
        "delivery" => "sat",
        "colour" => "green",
        "size" => "medium",
    }
    [8] => array(3){
        "delivery" => "sat",
        "colour" => "green",
        "size" => "large",
    }
    [9] => array(3){
        "delivery" => "",
        "colour" => "red",
        "size" => "medium",
    }        [10] => array(3){
        "delivery" => "sun",
        "colour" => "red",
        "size" => "small",
    }
    [11] => array(3){
        "delivery" => "sun",
        "colour" => "red",
        "size" => "medium",
    }
    [12] => array(3){
        "delivery" => "sun",
        "colour" => "red",
        "size" => "large",
    }
    [13] => array(3){
        "delivery" => "sun",
        "colour" => "blue",
        "size" => "small",
    }
    [14] => array(3){
        "delivery" => "sun",
        "colour" => "blue",
        "size" => "medium",
    }
    [15] => array(3){
        "delivery" => "sun",
        "colour" => "blue",
        "size" => "large",
    }
    [16] => array(3){
        "delivery" => "sun",
        "colour" => "green",
        "size" => "small",
    }
    [17] => array(3){
        "delivery" => "sun",
        "colour" => "green",
        "size" => "medium",
    }
    [18] => array(3){
        "delivery" => "sun",
        "colour" => "green",
        "size" => "large",
    }
}

我并不太担心输出格式。

【问题讨论】:

  • 每一个排列到底是什么?您的数组是多维的。请指定您的预期输出。
  • 抱歉,没有把它粘贴进去 - 也不要忘记它,因为它让我烦恼!给我2分钟
  • 不完全匹配(输入需要从name => foo, options => [...] 到直接foo => [...] 轻微按摩),但它绝对是您所追求的笛卡尔积。
  • 超过 3 个维度,我得了自动偏头痛。谢谢你们的帮助。

标签: php arrays multidimensional-array


【解决方案1】:

这适用于http://writecodeonline.com/php/

$option_array[] = array(
    "name" => "delivery",
    "options" => array(
        "sat", "sun")
);
$option_array[] = array(
    "name" => "colour",
    "options" => array(
        "red", "blue", "green")
);
$option_array[] = array(
    "name" => "size",
    "options" => array(
        "small", "medium", "large")
);

$N = 1;
foreach ($option_array as $options) $N *= count($options['options']);

$all_combinations = array();

for( $i = 0 ; $i < $N ; ++$i )
{
  $all_combinations[$i] = array();
  $q = $i;
  for( $j = count($option_array)-1 ; 0 <= $j ; --$j )
  {
    $opt = $option_array[$j];
    $nopts = count($opt['options']);
    $all_combinations[$i][$opt['name']] = $opt['options'][$q % $nopts];
    $q = floor($q / $nopts);
  }
}

print_r( $all_combinations );

【讨论】:

  • 完美。谢谢马特!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-29
  • 1970-01-01
相关资源
最近更新 更多