2012-07-11 34 views
1

我有兩個關聯數組:比較具有CSV兩種締數組值 - PHP

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]上的ArrayA應在CSV上檢查ArrayB。同樣,在ArrayB應該在ArrayA CSV中檢查。其他人應該照常進行比較==

注:我試圖避免在這裏循環。我們當然可以用Loop以多種方式做到這一點。我想知道是否有一個快速有效的方式來做到這一點沒有循環。

編輯:爲了進一步澄清,這是這兩個應該如何比較:

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? 
+0

你在找什麼?你需要知道兩個數組是否相同?你需要知道哪些數組鍵具有相同的值嗎? – siimsoni 2012-07-11 16:49:55

+0

@KSiimson這兩個數組總是會有一組相同的鍵。值可能會改變。我只是想比較這些值,看看它們是否相同。但問題是像我上面解釋的CSV值。 – 2012-07-11 16:54:55

回答

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 

編輯:爲了通過任一數組中的元素是否是另一個的子集,以評估兩個數組,我會正常化值來排列和使用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 
+0

我想你沒有得到我的問題。元素22在ArrayA中可以有多個值(CSV),而ArryB中的相同元素只能有一個值。 ArrayB中元素22的值應爲ArrayA中相同元素的CSV。 – 2012-07-11 17:48:41

+0

同樣適用於副varsa。 – 2012-07-11 17:49:33

+1

因此,如果ArrayA中的某個元素是CSV,則ArrayB中的元素不能爲CSV,並且如果元素爲ArrayB中的CSV,則ArrayA中的元素不能爲CSV?或者如果兩者都是CSV,會發生什麼? – siimsoni 2012-07-11 18:08:12