首頁 >後端開發 >php教程 >如何在保留鍵的同時產生關聯數組的笛卡爾積?

如何在保留鍵的同時產生關聯數組的笛卡爾積?

Barbara Streisand
Barbara Streisand原創
2024-12-25 10:39:11715瀏覽

How to Generate the Cartesian Product of an Associative Array While Preserving Keys?

在關聯數組中保留鍵的同時查找笛卡爾積

考慮以下關聯數組:

$input = array(
    'arm' => array('A', 'B', 'C'),
    'gender' => array('Female', 'Male'),
    'location' => array('Vancouver', 'Calgary'),
);

目標是找到該數組的笛卡爾積,同時保留原始數組關聯鍵。所需的輸出將是:

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'
    ),
    ...
)

演算法原理

假設輸入數組有N 個子數組($input),每個子數組都有Cn 項,其中n是它的索引。第 n 個子數組的第 i 項稱為 Vn,i。

演算法透過歸納法證明(假設沒有錯誤):

  1. 對於 N = 1,笛卡爾產品是一個簡單的一維數組。
  2. 假設結果已經包含第一個的笛卡爾積N-1個子數組,可以擴展如下:

    • Add KN => VN,1 到目前結果中的每個項目。
    • 對於第 N 個輸入子數組中的每個剩餘項目 (2 新增該項目的副本; VN,m.

程式碼實作

function cartesian($input) {
    $result = array();

    while (list($key, $values) = each($input)) {
        if (empty($values)) {
            continue;
        }

        if (empty($result)) {
            foreach ($values as $value) {
                $result[] = array($key => $value);
            }
        } else {
            $append = array();

            foreach ($result as &$product) {
                $product[$key] = array_shift($values);
                $copy = $product;

                foreach ($values as $item) {
                    $copy[$key] = $item;
                    $append[] = $copy;
                }

                array_unshift($values, $product[$key]);
            }

            $result = array_merge($result, $append);
        }
    }

    return $result;
}

此程式碼將輸出所需的笛卡爾積,同時保留原始值關聯鍵。

以上是如何在保留鍵的同時產生關聯數組的笛卡爾積?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn