第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

用PHP關(guān)聯(lián)數(shù)組求笛卡兒積

用PHP關(guān)聯(lián)數(shù)組求笛卡兒積

拉丁的傳說 2019-06-24 09:28:20
假設(shè)我有一個(gè)數(shù)組,如下所示:Array(     [arm] => Array         (             [0] => A            [1] => B            [2] => C        )     [gender] => Array         (             [0] => Female             [1] => Male         )     [location] => Array         (             [0] => Vancouver             [1] => Calgary         ))如何在保留外部關(guān)聯(lián)數(shù)組的鍵并在內(nèi)部數(shù)組中使用它們的同時(shí),找到笛卡兒積?算法的結(jié)果應(yīng)該是:Array(     [0] => Array         (             [arm] => A            [gender] => Female             [location] => Vancouver         )     [1] => Array         (             [arm] => A            [gender] => Female             [location] => Calgary         )     [2] => Array         (             [arm] => A            [gender] => Male             [location] => Vancouver         )...etc.我已經(jīng)查閱了很多笛卡爾積算法,但我仍然停留在如何保存關(guān)聯(lián)鍵的細(xì)節(jié)上。我目前使用的算法只給出數(shù)字索引:    $result = array();     foreach ($map as $a) {         if (empty($result)) {             $result = $a;             continue;         }         $res = array();         foreach ($result as $r) {             foreach ($a as $v) {                 $res[] = array_merge((array)$r, (array)$v);             }         }         $result = $res;     }     print_r($result);任何幫助都將不勝感激。用PHP關(guān)聯(lián)數(shù)組求笛卡兒積
查看完整描述

3 回答

?
ibeautiful

TA貢獻(xiàn)1993條經(jīng)驗(yàn) 獲得超6個(gè)贊

我能想到的是:

function inject($elem, $array) {
    return array_map(function ($n) use ($elem) { return array_merge((array)$elem, (array)$n); }, $array);}function zip($array1, $array2) {
    return array_reduce($array1, function ($v, $n) use ($array2) { return array_merge($v, inject($n, $array2));  }, array());}
    function cartesian_product($array) {
    $keys = array_keys($array);
    $prod = array_shift($array);
    $prod = array_reduce($array, 'zip', $prod);
    return array_map(function ($n) use ($keys) { return array_combine($keys, $n); }, $prod);}

(下面使用偽數(shù)組/列表/字典表示法,因?yàn)镻HP對(duì)于這類事情太冗長(zhǎng)了。)

這個(gè)inject函數(shù)變換a, [b]進(jìn)[(a,b)],即它向數(shù)組的每個(gè)值注入一個(gè)值,返回一個(gè)數(shù)組。不管是不是ab已經(jīng)是一個(gè)數(shù)組了,它將始終返回一個(gè)二維數(shù)組。

inject('a', ['foo', 'bar'])
    =>  [('a', 'foo'), ('b', 'bar')]

這個(gè)zip函數(shù)應(yīng)用inject函數(shù)到數(shù)組中的每個(gè)元素。

zip(['a', 'b'], ['foo', 'bar'])
    =>  [('a', 'foo'), ('a', 'bar'), ('b', 'foo'), ('b', 'bar')]

請(qǐng)注意,這實(shí)際上產(chǎn)生了笛卡爾積,因此zip有點(diǎn)用詞不當(dāng)。簡(jiǎn)單地將此函數(shù)應(yīng)用于數(shù)據(jù)集中的所有元素,就可以得到任意長(zhǎng)度數(shù)組的笛卡兒積。

zip(zip(['a', 'b'], ['foo', 'bar']), ['42', '76'])
    =>  [('a', 'foo', '42'), ('a', 'foo', '76'), ('a', 'bar', '42'), …]

這不包含鍵,但是由于元素在結(jié)果集中都是按順序排列的,所以您可以簡(jiǎn)單地將鍵重新注入結(jié)果。

array_combine(['key1', 'key2', 'key3'], ['a', 'foo', '42'])
    =>  [ key1 : 'a', key2 : 'foo', key3 : '42' ]

將其應(yīng)用于產(chǎn)品中的所有元素,將得到所需的結(jié)果。

如果您愿意,可以將上述三個(gè)函數(shù)折疊成一個(gè)長(zhǎng)語句(這也可以清除錯(cuò)誤的名稱)。


對(duì)于PHP<=5.2沒有匿名函數(shù)的“展開”版本如下所示:

function inject($elem, $array) {
    $elem = (array)$elem;
    foreach ($array as &$a) {
        $a = array_merge($elem, (array)$a);
    }
    return $array;}function zip($array1, $array2) {
    $prod = array();
    foreach ($array1 as $a) {
        $prod = array_merge($prod, inject($a, $array2));
    }
    return $prod;}function cartesian_product($array) {
    $keys = array_keys($array);
    $prod = array_shift($array);
    $prod = array_reduce($array, 'zip', $prod);

    foreach ($prod as &$a) {
        $a = array_combine($keys, $a);
    }
    return $prod;}


查看完整回答
反對(duì) 回復(fù) 2019-06-24
  • 3 回答
  • 0 關(guān)注
  • 635 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)