2017-02-21 9 views
1

У меня есть 2 многомерные массивы:Присоединение 2 многомерных массивов с помощью ключа в подрешетке

массива 1:

Array 
(
    [0] => Array 
    ( 
     [symbol] => ABN 
     [chf] => 11.20 
     [percent] => 0.16 
     [change] => 0.798168794168579 
    ) 
    ... 
    [1295] => Array 
    ( 
     [symbol] => ZURN 
     [chf] => 19.81 
     [percent] => -0.35 
     [change] => 0.06909317389138 
    ) 
    [1296] => Array 
    ( 
     [symbol] => 
     [chf] => 3.11 
     [percent] => 0.11 
     [change] => 0.798324232168579 
    ) 
) 

Массив 2:

Array 
(
    [0] => stdClass Object 
    ( 
     [symbol] => UBSG 
     [smi] => 1 
     [dax] => 0 
     [dow] => 0 
    ) 
    ... 
    [21] => stdClass Object 
    ( 
     [symbol] => XYZN 
     [smi] => 0 
     [dax] => 1 
     [dow] => 0 
    ) 
    [22] => stdClass Object 
    ( 
     [symbol] => ZURN 
     [smi] => 0 
     [dax] => 0 
     [dow] => 1 
    ) 
) 

Что мне нужно:

Новый массив 3 со следующими парами ключ/значение:

  • Array1.symbol
  • Array1.chf
  • Array1.percent
  • Array1.change
  • Array2.smi
  • Array2.dax
  • Array2.dow

ГДЕ Array1.symbol == Array2.symbol

Так что результат будет:

Array 
(
    [0] => Array 
    (
     [symbol] => ZURN 
     [chf] => 19.81 
     [percent] => -0.35 
     [change] => 0.06909317389138 
     [smi] => 0 
     [dax] => 0 
     [dow] => 1 
    ) 
) 

Я предполагаю, что это может быть сделано с чем-то вроде array_intersect, но я действительно не имею ни малейшего понятия.

Благодарим за помощь!

+0

«Проложить комментарий»: я не могу придумать, как лучше описать, что я имею в виду. Я думаю, это должно быть ясно. Я перечислил 2 массива и описал, как должен выглядеть третий массив. Массив 1 и 2 соответствует символу. – RoRu

ответ

0

Надеюсь, что эта помощь: используйте array_merge для объединения массивов.

Здесь ваш второй массив, содержащий объект таким образом сначала преобразовать его в массив

Попробуйте это:

$ arr1 < ------- 1-й массив

$ arr2 < ---- --- второй массив

foreach ($arr1 as $key=>$value) { 
     $result[$key]=array_merge((array)$arr2[$key],$arr1[$key]);  
    } 

var_dump($result); 
+0

Спасибо, но он не делает то, что я хотел – RoRu

1

раствор с помощью array_uintersect, json_encode, json_decode и array_merge функции:

// assuming $arr1 and $arr2 are your first and second array respectively 

// transforming second array into array of arrays for a proper comparison 
$arr2_transformed = json_decode(json_encode($arr2), true); 
$result = []; 

array_uintersect($arr1, $arr2_transformed, function ($a, $b) use(&$result){ 
    $comparison = strcmp($a['symbol'], $b['symbol']); 
    if ($comparison === 0) { // if `symbols` are equal 
     $result[] = array_merge($a, json_decode(json_encode($b), true)); 
    } 
    return $comparison;  
}); 

print_r($result); 

выход будет, как показано ниже:

Array 
(
    [0] => Array 
     (
      [symbol] => ZURN 
      [chf] => 19.81 
      [percent] => -0.35 
      [change] => 0.06909317389138 
      [smi] => 0 
      [dax] => 0 
      [dow] => 1 
     ) 
    .... 

) 

DEMO link

+0

Спасибо. К сожалению, он не работает. Я получаю 900 результатов, хотя есть только 22 возможных символа (см. Массив 2). – RoRu

+0

@ user2384968, почему вы решили, что он не работает? Проверьте мою демонстрационную ссылку – RomanPerekhrest

+0

Я думаю, это моя вина, извините! Я обновил структуру Arr1 и Arr2 выше. – RoRu

1

Вот решение, которое первым строит таблицу поиска для array2, а затем добавляет поля из array2 в Array1.

// build a lookup table of Array2 keyed by symbol 
$lookup = array_combine(
    array_map(function($item) { 
     return $item->symbol; 
    }, $arr2), $arr2); 
// add matching symbol fields from Array2 to Array1 
$result = array_map(function($item) use ($lookup) { 
    $symbol = $item["symbol"]; 
    return isset($lookup[$symbol]) ? 
     array_merge($item, (array)$lookup[$symbol]) : $item; 
}, $arr1); 

Попробуйте online.

Чтобы выйти из значений, которые не имеют символ соответствия, изменить следующим образом:

$result = array_filter(
    array_map(function($item) use ($lookup) { 
     $symbol = $item["symbol"]; 
     return isset($lookup[$symbol]) ? 
      array_merge($item, (array)$lookup[$symbol]) : null; 
    }, $arr1)); 

Попробуйте online.

+0

Отлично, работает почти идеально! Не следует включать массивы, которые не совпадают (в вашем onine-примере с символом «ABN»). – RoRu

+0

Решение 2 не работает. Он также отображает те, у которых есть пустой символ. Например, массив [1296] в Array1 также появляется, но он не должен, потому что символ пуст и в Array2 отсутствует соответствующий символ. – RoRu

+0

@RoRu Вы не указали это в исходном вопросе. Добавьте 'unset ($ lookup [" "]);' после 'array_combine' для удаления пустого символьного сопоставления. – Joe