2012-07-11 4 views
1

을 : 두 배열에 동일한 키의- 나는 두 개의 연관 배열이 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]ArrayB의 CSV로 확인해야합니다. 마찬가지로 [30]ArrayB은 CSV로 ArrayA에서 확인해야합니다. 기타는 평소와 같이 비교해야합니다. ==

참고 : 여기서는 루핑을 피하려고합니다. 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

+0

@KSiimson이 두 배열에는 항상 동일한 키 집합이 있습니다. 값이 변경 될 수 있습니다. 나는 그 값들을 비교하고 그들이 같은지보기를 원한다. 문제는 위에서 설명한 CSV 값에 있습니다. –

답변

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이어야합니다. –

+0

동일 함은 varsa에 적용됩니다. –

+1

요소가 ArrayA의 CSV이면 ArrayB의 CSV가 될 수 없으며 요소가 ArrayB의 CSV이면 ArrayA의 CSV가 될 수 없습니까? 또는 둘 다 CSV 인 경우 어떻게됩니까? – siimsoni