2015-01-29 2 views
0

업데이트해야하는 값 집합이있는 연락처 배열이 있습니다. 또한 기존 연락처와 업데이트 된 연락처 사이에 diff를 저장하는 contactChangeLog 배열이 있습니다. 업데이트 된 키만 로그에 저장해야합니다. 2 접촉 배열과 그래서 :array_diff_assoc()보다 PHP가 더 효율적인 알고리즘

$oldContact = array(
     'name' => 'Joeahkd', 
     'address' => '123 Masjdhfin', 
     'city' => 'Spring', 
     'state' => 'CA', 
     'zip' => '90101', 
); 

$newContact = array(
     'name' => 'Joe', 
     'address' => '123 Main St', 
     'city' => 'Springville', 
     'state' => 'CA', 
     'zip' => '90101', 
); 

내가 array_diff_assoc() ... 그러나

$existing = array_diff_assoc($oldContact, $newContact); 
$update = array_diff_assoc($newContact, $oldContact); 

$diff = array('previous' => $existing, 'new' => $update); 
print_r($diff); 

을 사용할 수 있습니다, 나는 각 배열 내가 큰 O 표기법에 대해 배운 것을 통해 두 번 반복하고하는 것은 나에게 그 ISN을 알려줍니다 '맞아. 업데이트 된 키 및 기존 값과 업데이트 된 값을 반환하는 알고리즘 적으로 효율적인 방법이 있습니까? 결과는 같아야합니다

$previous = array(
     'name' => 'Joeahkd', 
     'address' => '123 Masjdhfin', 
     'city' => 'Spring' 
); 

$updated = array(
     'name' => 'Joe', 
     'address' => '123 Main St', 
     'city' => 'Springville' 
); 

답변

1

당신은 array_filter을 시도 할 수 있습니다 :

$updated = array();  
$previous = array_filter($oldContact, function($v, $k) { 
    if ($v != $newContact[$k]) { 
     $updated[$k] = $newContact[$k]; 
     return true; 
    } 
    return false; 
}, ARRAY_FILTER_USE_BOTH); 

array_filter은에서 키/값을 반환합니다 우리가 지정한 콜백 함수가 각 키/값 반복 중에 true를 반환하면 입력 배열은 $previous이됩니다. 콜백 함수를 검사하는 동안 우리는 $updated을 생성합니다.

UPDATE : (당신이 당신의 질문에 뭔가를 추가하려면

$previous = array_filter($oldContact, function($v, $k) { 
    return ($v != $newContact[$k]); 
}, ARRAY_FILTER_USE_BOTH); 

$updated = array_intersect_key($newContact, $previous); 
+0

이것은 훌륭하다. 필자가 작성한 것과 익명의 함수를 사용하는 것보다 더 효율적입니다. PHP에서 그다지 많이 보지 못했습니다. – shotdsherrif

+0

또한 이러한 구현의 전후에 microtime()을 사용하여 간단한 벤치 마크 테스트를 수행 할 것입니다. C++ 프로그래머와 협력하여 언어가 사용하는 기본 C 라이브러리에 대해 논의했습니다. – shotdsherrif

0

내가 시도 할 다음 방법은 다음과 같습니다

public function diff($newObj, $oldObj) 
{ 
    $updatedVals = []; 
    $previousVals = []; 

    foreach ($newObj as $key => $value) 
    { 
     if ($newObj[$key] !== $oldObj[$key]) 
     { 
       $updatedVals[] = $newObj[$key]; 
       $previousVals[] = $oldObj[$key]; 
     } 

     return [$newVals, $previousVals]; 
    } 
} 
+0

, 그냥 그렇게 질문의 편집 버튼 왼쪽 하단을 사용

코드를 좀 더 잘라 array_intersect_keyarray_filter 사용 http://stackoverflow.com/posts/28209575/edit),'edit : ...'와 같이 작성하십시오. – Rizier123

+1

Thx. 사실 한 번에 질문을 편집했습니다. 또한 이틀 동안 원래 질문을 썼다. 그래서 마침내 게시 할 때, 나는 이미 가능한 대답을 내놓았습니다. 나는 그것이 일종의 대답이라고 생각했지만, 당신의 요점을 이해합니다. – shotdsherrif

+0

아, 네가 알아 낸 것이라면, 답이 좋을 것이다. D – Rizier123

관련 문제