Heim >Backend-Entwicklung >PHP-Tutorial >Wie erzeuge ich das kartesische Produkt eines assoziativen Arrays unter Beibehaltung der Schlüssel?

Wie erzeuge ich das kartesische Produkt eines assoziativen Arrays unter Beibehaltung der Schlüssel?

Barbara Streisand
Barbara StreisandOriginal
2024-12-25 10:39:11715Durchsuche

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

Kartesisches Produkt finden und dabei Schlüssel in assoziativen Arrays beibehalten

Stellen Sie sich ein assoziatives Array wie das folgende vor:

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

Das Ziel besteht darin, das kartesische Produkt dieses Arrays zu finden und dabei die ursprünglichen assoziativen Schlüssel beizubehalten. Die gewünschte Ausgabe wäre:

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

Begründung des Algorithmus

Angenommen, das Eingabearray hat N Unterarrays ($input), jedes mit Cn Elementen, wobei n ist sein Index. Das i-te Element des n-ten Unterarrays wird als Vn,i bezeichnet.

Der Algorithmus beweist (vorausgesetzt, dass keine Fehler vorliegen) durch Induktion:

  1. Für N = 1 die kartesische Das Produkt ist ein einfaches 1D-Array.
  2. Angenommen, das Ergebnis enthält bereits das kartesische Produkt des ersten N-1 Unterarrays, es kann wie folgt erweitert werden:

    • KN hinzufügen => VN,1 zu jedem Element im aktuellen Ergebnis.
    • Fügen Sie für jedes verbleibende Element im N-ten Eingabeunterarray (2 <= m <= CN) eine Kopie des Elements mit KN => hinzu ; VN,m.

Code-Implementierung

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;
}<p><strong>Verwendung</strong></p>
<pre class="brush:php;toolbar:false">$output = cartesian($input);
print_r($output);

Dieser Code gibt das gewünschte kartesische Produkt aus und behält dabei den ursprünglichen Assoziativwert bei Schlüssel.

Das obige ist der detaillierte Inhalt vonWie erzeuge ich das kartesische Produkt eines assoziativen Arrays unter Beibehaltung der Schlüssel?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn