1

PHP には、次のような 2 つの配列があります。

$array1 = array(array("1", "3", "4"), array("1", "4"));
$array2 = array(array("5", "4", "3", "2"), array("5", "3"));

ここで、これら 2 つの多次元配列の可能な交点をすべて取得したいと考えています。合計で 4 つの配列を取得することを意味します。

  • $array1[0]&$array2[0]
  • $array1[1]&$array2[0]
  • $array1[0]&$array2[1]
  • $array1[1]&$array2[1]

を使用して、1 次元配列から交点を取得できますarray_intersect()。しかし、どうすれば複数の多次元配列のすべての可能な交点を取得できますか?

4

2 に答える 2

3

ここでは、配列のすべての組み合わせを含む配列を作成するため、後でこれらの配列の交点を取得できます。

配列の組み合わせ

まず、可能な配列の組み合わせをすべて作成する必要があります。それは次のとおりです。

c配列 1 * c配列 2 * ... * c配列 n

「c」count()は単に配列の

したがって、特定の例では次のようになります。

c配列1 * c配列2 => 2 * 2 => 4通りの組み合わせ

次に、これらすべての組み合わせを取得して配列に入れる必要があります。このために、空の$combinations配列から始めます。次に、配列内にあるすべての組み合わせをループし、次の配列をそれにマージして、組み合わせが目的の長さ (この場合は配列の量) になるまで続けます。

例として:

Array with the elements (Empty array is '[]'):

[
    [[1, 3, 4], [1, 4]],     //array 1
    [[5, 4, 3, 2], [5, 3]],  //array 2
]

           1* combination array    2* new array     //↓new combinations
                    ↓                   ↓           //↓for the next iteration
                                                    │
array NAN*:

    Combinations:
                  - []                              │  -> []
                                                       │
array 1:            ┌──────────────────────────────────┘
                    │                       
    Combinations:   v                       
                  - []             + [1, 3, 4]      │  -> [[1, 3, 4]]  
                  - []             + [1, 4]         │  -> [[1, 4]]   
                                                       │
array 2:            ┌──────────────────────────────────┘
                    │                       
    Combinations:   v                       
                  - [[1, 3, 4]]    + [5, 4, 3, 2]   │  -> [[1, 3, 4], [5, 4, 3, 2]]
                  - [[1, 3, 4]]    + [5, 3]         │  -> [[1, 3, 4], [5, 3]]
                  - [[1, 4]]       + [5, 4, 3, 2]   │  -> [[1, 4], [5, 4, 3, 2]]
                  - [[1, 4]]       + [5, 3]         │  -> [[1, 4], [5, 3]] 
                                                    //↑ All combinations here

* NAN: 数字ではありません

したがって、上記の例でわかるように、すべての配列の量の長さを持つすべての組み合わせがあります (長さ 2 要素の 4 つの組み合わせ)。

上記の例に示すように、組み合わせを取得するコードは次のとおりです。

// for ループは、各組み合わせの目的の長さを確実に取得します
//(私たちが持っている配列の量。ここでは 2)
for ($count = 0, $length = count($data); $count < $length; $count++) {  

    $tmp = [];

    foreach ($combinations as $v1) {   //1* 組み合わせ配列

        foreach ($data[$count] as $v2)   //2* 新しい配列
            $tmp[] = array_merge($v1, [$v2]); // 新しい組み合わせの作成

    }

    $combinations = $tmp; //次の反復のために新しい組み合わせを割り当てる

}

あなたの特定の例では、この配列を生成します:

Array
(
[0] => Array  //Combination 1
    (
        [0] => Array
            (
                [0] => 1
                [1] => 3
                [2] => 4
            )

        [1] => Array
            (
                [0] => 5
                [1] => 4
                [2] => 3
                [3] => 2
            )

    )

[1] => Array  //Combination 2
    (
        [0] => Array
            (
                [0] => 1
                [1] => 3
                [2] => 4
            )

        [1] => Array
            (
                [0] => 5
                [1] => 3
            )

    )

[2] => Array  //Combination 3
    (
        [0] => Array
            (
                [0] => 1
                [1] => 4
            )

        [1] => Array
            (
                [0] => 5
                [1] => 4
                [2] => 3
                [3] => 2
            )

    )

[3] => Array  //Combination 4
    (
        [0] => Array
            (
                [0] => 1
                [1] => 4
            )

        [1] => Array
            (
                [0] => 5
                [1] => 3
            )

    )

)

配列交差

すべての組み合わせが揃ったので、組み合わせ配列を調べて、各組み合わせarray_map()の を取得します。array_intersect()そして、交点が必要な配列の数がわからないため、次のように使用しますcall_user_func_array()

$intersections = array_map(function($v){
    //intersection of each combination, which we created
    return call_user_func_array("array_intersect", $v);
}, $combinations);

完全なコード:

<?php

    $array1 = [[1, 3, 4], [1, 4]];
    $array2 = [[5, 4, 3, 2], [5, 3]];


    function getIntersections($data = []) {
        $combinations = [[]];

        for ($count = 0, $length = count($data); $count < $length; $count++) {
            $tmp = [];
            foreach ($combinations as $v1) {
                foreach ($data[$count] as $v2)
                    $tmp[] = array_merge($v1, [$v2]);
            }
            $combinations = $tmp;
        }

        $intersections = array_map(function($v){
            return call_user_func_array("array_intersect", $v);
        }, $combinations);

        return $intersections;

    }

    $intersections = getIntersections([$array1, $array2]);
    print_r($intersections);

?>

出力:

Array
(
    [0] => Array  //Intersection of: [1, 3, 4] && [5, 4, 3, 2]
        (
            [1] => 3
            [2] => 4
        )

    [1] => Array  //Intersection of: [1, 3, 4] && [5, 3]
        (
            [1] => 3
        )

    [2] => Array  //Intersection of: [1, 4] && [5, 4, 3, 2]
        (
            [1] => 4
        )

    [3] => Array  //Intersection of: [1, 4] && [5, 3]
        (
        )

)
于 2015-12-12T13:43:35.033 に答える