2016-11-11 2 views
2

Я пытаюсь сравнить два массива и извлечь некоторую информацию об одном из них и сохранить его в другом массиве (3-й). Структура этих двух массивов выглядит следующим образом:Сравнение массивов в php

Array(
[0] => stdClass Object 
    (
     [Id] => 123 
     [Size] => small 
     [Color] => yellow 
    ) 
[1] => stdClass Object 
    (
     [Id] => 456 
     [Size] => large 
     [Color] => red 
    ) 
[2] => stdClass Object 
    (
     [Id] => 789 
     [Size] => medium 
     [Color] => blue 
    ) 
) 
Array 
(
[0] => stdClass Object 
    (
     [Id] => 456 
     [Size] => large 
     [Color] => red 
     [Available] => true 
    ) 

[1] => stdClass Object 
    (
     [Id] => 123 
     [Size] => small 
     [Available] => false 
    ) 
[2] => stdClass Object 
    (
     [Id] => 789 
     [Size] => medium 
     [Color] => blue 
     [Available] => true 
    ) 
) 

В примере, мне нужно хранить свойство «доступный» только если идентификатор из этих массивов равны.

То, что я пытался сделать:

for (var $i = 0; $i < count($arrayA); $i++) { 
    if ($ArrayA[$i]->Id == $arrayB[$i]->Id) { 
     $getAvailable = $arrayB[$i]->Available; 
    } 
} 

Проблема:

Поскольку мы можем иметь ситуацию, когда свойство идентификатора в массиве А, позиция 0 находится в другом положении, в массив B, который может иметь другую структуру, я понятия не имею, как я могу получить доступ к информации, которая мне нужна (доступна), из одного массива, сравнивающего идентификаторы ArrayB и ArrayA.

Я извиняюсь, если я не объяснить это лучше, потому что это немного трудно описать словами эту ситуацию, но дайте мне знать, если у вас есть какие-либо вопросы, и, пожалуйста, помогите мне найти решение :)

Желаемая массив должен выглядеть следующим образом:

Array(
[0] => stdClass Object 
(
    [Id] => 123 
    [Size] => small 
    [Color] => yellow 
    [Available] => false 
) 
+0

Что желаемая * новый * массив выглядеть ?? –

+0

Я отредактировал вопрос и добавил эту информацию в конце. @Dagon –

+0

ах ок, это имеет смысл. любое изменение получения идентификатора в качестве ключа для начала? если не его цикл в массиве, выполняющий поиск на другом для каждого id –

ответ

1
$arr1 = array(
    0 => (object)(array(
     'Id' => '123', 
     'Size' => 'small', 
     'Color' => 'yellow' 
    )), 
    1 => (object)(array 
    (
     'Id' => '456', 
     'Size' => 'large', 
     'Color' => 'red' 
    )), 
    2 => (object)(array 
    (
     'Id' => '789', 
     'Size' => 'medium', 
     'Color' => 'blue' 
    )) 
); 
$arr2 = array(
    0 => (object)(array 
    (
     'Id' => '456', 
     'Size' => 'large', 
     'Color' => 'red', 
     'Available' => 'true' 
    )), 
    1 => (object)(array 
    (
     'Id' => 123, 
     'Size'=> 'small', 
     'Available' => 'false' 
    )), 
    2 => (object)(array 
    (
     'Id' => '789', 
     'Size' => 'medium', 
     'Color' => 'blue', 
     'Available' => 'true' 
    )) 
); 

Первый: объявить новую переменную массив, который впоследствии будет храниться ваш новый структурированный массив

$newArr = array(); 

Затем цикл ваш первый массив $ arr1

foreach($arr1 as $row1) { 
} 

затем в первом контуре создайте еще один цикл, который найдет идентификатор совпадения из второго массива $arr2 просто сравните там идентификатор, и если это совпадение, слейте их

foreach($arr2 as $row2) { 
    if ($row1->Id == $row2->Id) { 
     // do something 
    } 
} 

затем толкать их, но, прежде чем объединить их, вы должны преобразовать их в ассоциативный массив

$newArr[] = array_merge((array)$row1, (array)$row2); 

в новый массив. и просто остановить цикл суб после найти это идентификатор матча с помощью

break; 

так ваш цикл Еогеасп бы как этот

$newArr = array(); 
foreach($arr1 as $row1) { 
    foreach($arr2 as $row2) { 
     if ($row1->Id == $row2->Id) { 
      $newArr[] = array_merge((array)$row1, (array)$row2); 
      break; 
     } 
    } 
} 
+0

Это будет неэффективно на больших массивах, но нормально для малого –

0

Это не является эффективным для большого массива, но здесь вы идете

function getEqual($arrayA, $arrayB){ 

foreach($arrayA as $aIndex => $aData){ 
    $id = $aData['Id']; 
     $aData['Available'] = false; 

    foreach($arrayB as $bIndex => $bData){ 
     if($id == $bData['Id']){ 
      $aData['Available'] = true; 
     } 
    } 

    $arrayA[$aIndex] = $aData; 
} 

return $arrayA; 

}

+0

Что тогда было бы эффективно? Не могли бы вы дать мне подсказку о методах? (btw - последняя фигурная скобка выскользнула из кодового блока) – lynx

Смежные вопросы