2015-03-06 2 views
1

Я хочу объединить 2 массива объектов на основе поля 'id' массива Array1 и 'itemVendorCode' из Array2. Я также хотел удалить из результирующих массивов объекта все, что не соответствовало.PHP - Объединить 2 массива объекта с помощью ключа/id

Array1:

Array 
(
    [0] => stdClass Object 
     (
      [id] => 10-423-1176 
      [qty] => 2 
      [price] => 12.6 
     ) 

    [1] => stdClass Object 
     (
      [id] => 89-575-2354 
      [qty] => 24 
      [price] => 230.35 
     ) 

    [2] => stdClass Object 
     (
      [id] => 89-605-1250 
      [qty] => 2 
      [price] => 230.35 
     ) 
) 

array2:

Array 
(
    [0] => Item Object 
     (
      [internalId] => 14062 
      [itemVendorCode] => 89-605-1250 
     ) 

    [1] => Item Object 
     (
      [internalId] => 33806 
      [itemVendorCode] => 89-575-2354 
     ) 

    [2] => Item Object 
     (
      [internalId] => 64126 
      [itemVendorCode] => 26-295-1006 
     ) 
) 
+1

А вы пробовали что-нибудь? Или вы просто хотите, чтобы мы писали ваш код? – Rizier123

+0

можете ли вы показать какой-либо образец вывода, который вы хотите? –

+0

@ Rizier123, я пробовал и искал лучшего ответа. Я не буду спрашивать, не пробовал ли я что-нибудь. Я не прошу вас написать мне весь код. –

ответ

0

Я думаю, что вы должны будете использовать array_map функцию, которая предоставляет вам функцию обратного вызова для выполнения на массив (ы).

В функции обратного вызова: - возвещать array1 - Foreach второго массива - установить, если заявление, чтобы проверить, что текущая итерация со значением идентификатора соответствует itemVendorCode из массив2 и вернуть его

что-то как это:

// You have to specify to PHP to use a local copy of your $array2 to works with it into your callback 
$cb = function ($obj1) use ($array2) 
{ 
    // you foreach this array 
    foreach ($array2 as $obj2) { 
     // if the value of id matches itemVendorCode 
     if ($obj1->id === $obj2->itemVendorCode) { 
      // you return the id 
      return $obj->id; 
     } 
    } 
}; 

// this function will fill a new array with all returned data 
$mergedArray = array_map($cb, $array1); 

Этот код представляет собой образец, но не дает вам, ваше решение иглами, попробуйте обновить его, чтобы сделать то, что вы именно хотите;)

1

я был в состоянии решить эту проблему с помощью этого кода:

$indexed = array(); 

foreach($itemsArray as $value) { 
    $indexed[$value->itemVendorCode] = $value; 
} 


$results = array(); 

foreach($vendorItems as $obj) { 
    $value = $indexed[$obj->id]; 

    if (isset($value)) { 
     foreach($value as $name => $val) { 
      $obj->$name = $val; 
      array_push($results, $obj); 
     } 
    } 

} 

print_r($results); 

кредитов оригинального плаката. Я только изменил его немного,

Я был в состоянии получить результат, как этот:

Array 
(
    [0] => stdClass Object 
     (
      [id] => 10-423-1176 
      [qty] => 2 
      [price] => 12.6 
      [internalId] => 2035 
      [itemVendorCode] => 10-423-1176 
     ) 

    [1] => stdClass Object 
     (
      [id] => 10-423-1176 
      [qty] => 2 
      [price] => 12.6 
      [internalId] => 2035 
      [itemVendorCode] => 10-423-1176 
     ) 

    [2] => stdClass Object 
     (
      [id] => 14-102-1010 
      [qty] => 16 
      [price] => 3.2 
      [internalId] => 57033 
      [itemVendorCode] => 14-102-1010 
     ) 
)