1

私は2つの連想配列を持っています:

ArrayA = array( [10] => ten
                [12] => twelve
                [22] => 10
                [30] => 10, 12, 8
         )
ArrayB = array( [10] => net
                [12] => evlewt
                [22] => 11, 12, 10
                [30] => 10
         )

両方の配列の同じキーの値を比較する必要があります。一部のキーにはCSV値があり、両方の配列に含めることができます。

たとえば、[22]onArrayAはCSVonでチェックする必要がありますArrayB。同様に、[30]inArrayBはCSVでチェックインする必要がありますArrayA。他はいつものように比較する必要があります==

注:ここではループを回避しようとしています。確かに、ループを使用すると、これを複数の方法で行うことができます。ループせずにこれを行うための迅速で効率的な方法があるかどうか疑問に思っています。

編集:さらに明確にするために、これはこれら2つを比較する方法です:

Is "ten" in ArrayA == "net" in ArrayB?
Is "twelve" in ArrayA == "evlewt" in ArrayB?
Is 10 in ArrayA existing in (11, 12, 10) of ArrayB?
Is (10, 12, 8) of ArrayA containing the 10 ArrayB?
4

1 に答える 1

2

質問を正しく理解できれば幸いです。最初にデータを正規化すると、配列を比較できます

例えば:

$a = array(
    10 => 'net',
    12 => 'evlewt',
    22 => '10,12,11',
    30 => '12,10'
);

$b = array(
    10 => 'net',
    12 => 'evlewt',
    22 => '11,12,10',
    30 => '12,10'
);

function normalize(&$value, $key) {
    $value = explode(',', $value);
    sort($value);
    $value = implode(',', $value);
}

array_walk($a, 'normalize');
array_walk($b, 'normalize');

var_dump($a == $b); // outputs true

編集:どちらかの配列の要素が別の配列のサブセットであるかどうかによって2つの配列を評価するために、値を配列に正規化してreduce_array()関数を使用します。

<?php
$a = array(
    10 => 'net',
    12 => 'evlew',
    22 => '10,12,11',
    30 => '12,10,11'
);

$b = array(
    10 => 'net',
    12 => 'evlewt',
    22 => '11,12,10',
    30 => '12,10'
);

function normalize(&$value, $key) {
    $value = explode(',', $value);
}

function compare_value($v, $w) {
    if (false === $v) return false;
    global $a, $b;
    if(is_subset($a[$w], $b[$w]) || is_subset($b[$w], $a[$w]))
        return true;
    return false;
}

function is_subset($needle, $haystack) {
     return count(array_intersect($needle, $haystack)) === count($needle);
}

array_walk($a, 'normalize');
array_walk($b, 'normalize');

$result = array_reduce(array_keys($a), 'compare_value', true);
var_dump($result); // outputs false

$a = array(
    10 => 'net',
    12 => 'evlewt',
    22 => '10',
    30 => '12,10,11'
);

$b = array(
    10 => 'net',
    12 => 'evlewt',
    22 => '11,12,10',
    30 => '12,10'
);

array_walk($a, 'normalize');
array_walk($b, 'normalize');

$result = array_reduce(array_keys($a), 'compare_value', true);
var_dump($result); // outputs true
于 2012-07-11T17:07:56.663 に答える