2013-10-29 2 views
3

두 개의 개체 배열이 있습니다.PHP : 개체 배열 값을 다른 정렬되지 않은 개체 배열로 업데이트하십시오.

먼저 배열 $x :

[0] => stdClass Object 
    (
     [id] => 54 
     [value] => test54 
     [something] => testtest54 
    ) 

[1] => stdClass Object 
    (
     [id] => 21 
     [value] => test21 
     [something] => testtest21 
    ) 
... 

두 번째 배열 $y : 내 첫 번째 배열 같은 id가 두 번째 어레이 ($y) 필드의 value을 가져 $x을 업데이트 할

[0] => stdClass Object 
    (
     [id] => 21 
     [value] => test21_new_value 
    ) 

[1] => stdClass Object 
    (
     [id] => 54 
     [value] => test54_new_value 
    ) 
... 

, 갖고 싶은 :

[0] => stdClass Object 
    (
     [id] => 54 
     [value] => test54_new_value 
     [something] => testtest54 
    ) 

[1] => stdClass Object 
    (
     [id] => 21 
     [value] => test21_new_value 
     [something] => testtest21 
    ) 
... 

나는 이런 식으로 뭔가 할 수 있습니다

foreach($x as $k => $v) { 
    foreach($y as $k2 => $v2) { 
     if ($v->id === $v2->id) $x[$k]->value = $v2->value; 
    } 
} 

을하지만 (각 $x에 대한 배열 $y에 걸어 가지고 있기 때문에 나는이 싫어 내가 $y$x 100 개 항목 100 개 항목이있는 경우, 그것은 100 * 100 번 루프). 더 효율적인, 우아하고 최적화 된 방법이 있다고 생각합니다.하지만 어떻게 해야할지 모르겠습니다. (이 특정 문제에 대한 정확한 응답을 찾지 못했기 때문에 여기에서 물어 봅니다.)

답변

2

확실히. 당신이 할 수없는 경우

<?php 
    $assocX = array(); 
    foreach ($x as $v) { 
     $assocX[$v->id] = $v; 
    } 

    foreach ($y as $v) { 
     $v->something = $assocX[$v->id]->something; 
    } 
?> 

: 일반적으로 당신은이 (100 + 100) 반복 대신 (* 100 100)를 의미하는 것처럼, (키가 고유 ID 인 상태)이 대한 associative array을 사용하십시오

<?php 
    $assocX = array(); 
    foreach ($x as $v) { 
     $assocX[$v->id] = $v; 
    } 

    foreach ($y as $v) { 
     $v->something = (isset($assocX[$v->id]) ? $assocX[$v->id]->something : null); 
    } 
?> 
+0

확인 덕분에 많은 : 값이 $x에 있는지 당신이 (NULL로 번역 할 것 "값 없음")을 확인 할 수 있는지! 사실, 객체 배열에는'&'가 필요하지 않습니다. $ v는 이미 객체에 대한 참조입니다 (하나의 루프로 시도했지만 어쩌면 틀렸거나 이해할 수 없습니다). –

+0

@ rap-2-h 맞습니다. 객체는 항상 참조로 전달됩니다 (잊어 버렸습니다 - 늦은 시간입니다!) :) – h2ooooooo