笛卡尔积
<ul>
<li>在数学中,两个集合X和Y的笛卡尔积(Cartesian product),又称直积,表示为X*Y,第一个对象是X的成员而第二个对象是Y的所有可能有序对的其中一个成员。</li>
<li>假设集合A={a,b},集合B={0,1,2},则两个集合的笛卡尔积为{(a,0),(a,1),(a,2),(b,0),(b,1),(b,2)}</li>
<li>商品规格使用此算法</li>
</ul>
<h2>实现</h2>
<pre><code class="language-php">function decare(array $arr)
{
if (empty($arr)) {
return $arr;
}
$result = [[]];
foreach ($arr as $index => $info) {
$append = [];
foreach ($result as $product) {
foreach ($info as $item) {
$product[$index] = $item;
$append[] = $product;
}
}
$result = $append;
}
return $result;
}</code></pre>
<h2>测试</h2>
<pre><code class="language-php">$data = [
'Color' => ['Red', 'Green'],
'Size' => [39, 40, 41],
'Local' => ['BeiJing', 'ShangHai'],
];
$decare = decare($data);
var_export($decare);</code></pre>
<h2>结果</h2>
<pre><code class="language-php">array (
0 => array (
'Color' => 'Red',
'Size' => 39,
'Local' => 'BeiJing',
),
1 => array (
'Color' => 'Red',
'Size' => 39,
'Local' => 'ShangHai',
),
2 => array (
'Color' => 'Red',
'Size' => 40,
'Local' => 'BeiJing',
),
3 => array (
'Color' => 'Red',
'Size' => 40,
'Local' => 'ShangHai',
),
4 => array (
'Color' => 'Red',
'Size' => 41,
'Local' => 'BeiJing',
),
5 => array (
'Color' => 'Red',
'Size' => 41,
'Local' => 'ShangHai',
),
6 => array (
'Color' => 'Green',
'Size' => 39,
'Local' => 'BeiJing',
),
7 => array (
'Color' => 'Green',
'Size' => 39,
'Local' => 'ShangHai',
),
8 => array (
'Color' => 'Green',
'Size' => 40,
'Local' => 'BeiJing',
),
9 => array (
'Color' => 'Green',
'Size' => 40,
'Local' => 'ShangHai',
),
10 => array (
'Color' => 'Green',
'Size' => 41,
'Local' => 'BeiJing',
),
11 => array (
'Color' => 'Green',
'Size' => 41,
'Local' => 'ShangHai',
),
)</code></pre>