2013-08-12 5 views
0

PHP에서 두 개의 배열을 비교하고 싶습니다. 이PHP에서 배열 비교, 그리고 diff 값을 찾으십시오

Array ( 
[0] => Array ([Id] => 1 [row1] => 1458) 
[1] => Array ([Id] => 2 [row1] => 16) 
[2] => Array ([Id] => 3 [row1] => 115) 
[3] => Array ([Id] => 4 [row1] => 18) 
[4] => Array ([Id] => 5 [row1] => 13) 
[5] => Array ([Id] => 6 [row1] => 13) 
[6] => Array ([Id] => 7 [row1] => 131) 
) 

Array ( 
[0] => Array ([Id] => 1 [row1] => 158) 
[1] => Array ([Id] => 2 [row1] => 165) 
[2] => Array ([Id] => 3 [row1] => 111) 
[3] => Array ([Id] => 4 [row1] => 186) 
[4] => Array ([Id] => 5 [row1] => 3) 
) 

는 첫째, 배열 1의 크기와 배열 2 크기가 항상 동일하지 않은 것처럼 내 배열 보인다. 값이 존재하지 않을 경우 존재하는 경우 배열 1의 ID 값 수도 있고 배열 2의 수도 존재하지 않는, 기능

[someindex] => Array ([Id] => 6 [row1] => 13) 

같은 array3 총 색인 인쇄해야 함수 배열 1의 ROW1에 빼기해야 이

[someindex] => Array ([Id] => 1 [row1] => 1300) 

내 최종 출력과 같은 array3의 배열 2 및 인쇄의 ROW1는

Array ( 
[0] => Array ([Id] => 1 [row1] => 1300) 
[1] => Array ([Id] => 2 [row1] => -149) 
[2] => Array ([Id] => 3 [row1] => 4) 
[3] => Array ([Id] => 4 [row1] => -168) 
[4] => Array ([Id] => 5 [row1] => 10) 
[5] => Array ([Id] => 6 [row1] => 13) 
[6] => Array ([Id] => 7 [row1] => 131) 
) 

어느 한이 문제를 해결하는 나를 도울 수 있어야한다. 이 정확히 당신이 원하는 경우

답변

0

먼저 하나가있다 Id 값을 키로 사용하거나 검색 기능을 작성하여 두 번째 배열을 검색 할 수있게하십시오. 나는 전자를 선택 해요 :

$searchable = array_reduce($array2, function(&$result, $item) { 
    return $result + array($item['Id'] => $item['row1']); 
}, array()); 

array_reduce() 함수는 빈 배열로 시작하고 배열 더하기 연산자를 사용하여 빌드; id를 사용하여 역 참조 할 수있는 배열을 만듭니다.

그런 다음 첫 번째 배열에지도 작업을 수행 :

$array3 = array_map(function($item) use ($searchable) { 
    $value = isset($searchable[$item['Id']]) ? $searchable[$item['Id']] : 0; 
    $item['row1'] -= $value; 
// $item['row2'] = $item['row1'] - $value; 
    return $item; 
}, $array1); 

이지도 작업이 원래의 배열을 유지하고 콜백 함수 내에서 선택한 값을 새로 생성 하.

+0

잭 감사 row1',이다 내가 완벽하게 원하는 것. – Sreenath

+0

하지만 배열에 레코드가 10000 개가 있다면 어떻게 될까요? 시간이 걸립니까? – Sreenath

+0

@Sreenath 내 테스트 결과이 방법은 내 것보다 75 % 느리다. 평균치 = 0.145, 평균치 = 0.083. 비록 공정하기는하지만, 어떤 크기의 간격이 실제로 나타나기 시작했는지는 모르겠다. 따라서 사용하는 배열의 크기에 따라 달라진다. – SmokeyPHP

0

모르겠지만, 키가 array_key_exists에있는 경우 당신은 확인할 수 있습니다

$array3 = array(); 
foreach ($array1 as $k => $v) { 
     if (array_key_exists($k, $array2)) { 
      $array3[] = $v - $array2[$k]; 
     } else { 
      $array3[] = $v; 
     } 
    } 
1
$arr1 = Array ( 
    0 => Array ('Id' => 1, 'row1' => 1458) 
    ,1 => Array ('Id' => 2, 'row1' => 16) 
    ,2 => Array ('Id' => 3, 'row1' => 115) 
    ,3 => Array ('Id' => 4, 'row1' => 18) 
    ,4 => Array ('Id' => 5, 'row1' => 13) 
    ,5 => Array ('Id' => 6, 'row1' => 13) 
    ,6 => Array ('Id' => 7, 'row1' => 131) 
); 
$arr2 = Array ( 
    0 => Array('Id' => 1, 'row1' => 158) 
    ,1 => Array('Id' => 2, 'row1' => 165) 
    ,2 => Array('Id' => 3, 'row1'=> 111) 
    ,3 => Array('Id' => 4, 'row1' => 186) 
    ,4 => Array('Id' => 5, 'row1' => 3) 
); 
$final = array(); 
foreach($arr1 as $k => $sec) 
{ 
    $sub = 0; 
    foreach($arr2 as $sec2) 
    { 
     if($sec2['Id']==$sec['Id']) 
     { 
      $sub = $sec2['row1']; 
      break; 
     } 
    } 
    $sec['row1'] -= $sub; 
    //Or to save to another element: 
    //$sec['row2'] = $sec['row1']-$sub; 
    $final[] = $sec; 
} 

echo '<pre>'.print_r($final,true).'</pre>'; 

출력 :

Array ( 
    [0] => Array ([Id] => 1 [row1] => 1300) 
    [1] => Array ([Id] => 2 [row1] => -149) 
    [2] => Array ([Id] => 3 [row1] => 4) 
    [3] => Array ([Id] => 4 [row1] => -168) 
    [4] => Array ([Id] => 5 [row1] => 10) 
    [5] => Array ([Id] => 6 [row1] => 13) 
    [6] => Array ([Id] => 7 [row1] => 131) 
) 
+0

감사합니다, 그것은 일했다. – Sreenath

+1

@Sreenath 실제 ID 값은 조회에 사용되지 않습니다. 분명히 너무 일찍 나를 위해 여전히 ... –

+0

@Jack 난 그냥 당신이 무슨 뜻인지 나타났습니다 잭은 매우 옳게 지적이에 의해 요소를 연결되지 않은' id '요소. 이제는 제대로하고 있습니다. – SmokeyPHP

0

이는 경우 인덱싱 배열 ($new)가 주요 키가 원래의 배열에서의 일치하지 않는 만듭니다.

$arr = array ( 
    0 => array ('Id' => '1','row1' => 1458), 
    1 => array ('Id' => '2','row1' => 16), 
    2 => array ('Id' => '3','row1' => 115), 
    3 => array ('Id' => '4','row1' => 18), 
    4 => array ('Id' => '5','row1' => 13), 
    5 => array ('Id' => '6','row1' => 13), 
    6 => array ('Id' => '7','row1' => 131)); 
$arr2 = array ( 
    0 => array ('Id' => '1','row1' => 158), 
    1 => array ('Id' => '2','row1' => 165), 
    2 => array ('Id' => '3','row1' => 111), 
    3 => array ('Id' => '4','row1' => 186), 
    4 => array ('Id' => '5','row1' => 3)); 
$new = array(); 
foreach ($arr2 as $key => $value){ 
    $new[$value['Id']] = $value['row1']; 
} 
foreach ($arr as $key => $value){ 
    if (isset($new[$value['Id']])){ 
     $arr[$key]['row1'] -= $new[$value['Id']]; 
    } 
} 
print_r($arr);