Nano Hash - криптовалюты, майнинг, программирование

Объединить два ассоциативных массива по одному и тому же ключу

У меня есть два ассоциативных массива, имеющих одно общее значение, например

ARRAY 1(
  [0]=>
  array(2) {
    ["ID"]=> "AAAA"
    ["Name"]=> "Apple"
  }
  [1]=>
  array(2) {
    ["ID"]=> "BBBB"
    ["Name"]=> "Avocado"
  }
  [3]=>
  array(2) {
    ["ID"]=> "CCCC"
    ["Name"]=> "Banana"
  }
)



Array2 (
  [0]=>
  array(4) {
    ["ID"]=> "AAAA"
    ["Taste"]=> "Yumi"
    ["Location"]=> "France"
    ["Price"]=> "Cheap"
  }
  [1]=>
  array(4) {
    ["ID"]=> "CCCC"
    ["Taste"]=> "Yumi"
    ["Location"]=> "Africa"
    ["Price"]=> "Cheap"
  }
  [3]=>
  array(4) {
    ["ID"]=> "BBBB"
    ["Taste"]=> "Yumi"
    ["Location"]=> "America"
    ["Price"]=> "Expansive"
  }
  [3]=>
  array(4) {
    ["ID"]=> "HZGA"
    ["Taste"]=> "Berk"
    ["Location"]=> "Moon"
    ["Price"]=> "Expansive"
  }    

)

Я хотел бы объединить их обоих по их идентификатору. Простое слияние невозможно, потому что они не отсортированы, имеют более 40 000 значений и не имеют одинакового размера.

Я планировал использовать двойной foreach и создать третий массив, если идентификатор был общим, я отказался от этой идеи. Поскольку анализ 40 000 значений в первом массиве для каждого из 40 000 значений из второго массива занимает слишком много времени.

Есть какое-то решение? Я хотел бы, чтобы в финале это выглядело так:

ArrayFinal (
  [0]=>
  array(4) {
    ["ID"]=> "AAAA"
    ["Name"]=> "Apple"
    ["Taste"]=> "Yumi"
    ["Location"]=> "France"
    ["Price"]=> "Cheap"
  }
  [1]=>
  array(4) {
    ["ID"]=> "CCCC"
    ["Name"]=> "Banana"
    ["Taste"]=> "Yumi"
    ["Location"]=> "Africa"
    ["Price"]=> "Cheap"
  }
  [3]=>
  array(4) {
    ["ID"]=> "BBBB"
    ["Name"]=> "Avocado"
    ["Taste"]=> "Yumi"
    ["Location"]=> "America"
    ["Price"]=> "Expansive"
  }
)
29.05.2018

Ответы:


1

Вы не можете избежать цикла. Но foreach работает довольно быстро. Протестировано на массиве 50 000, и это заняло 0,04 секунды.

Что это будет делать:

  • создать массив TMP
  • получить значения KEY и ID из ARRAY1
  • поместите их как «ID» => ключ в массиве TMP
  • зациклить ARRAY2, получить идентификатор
  • найдите соответствующий идентификатор в TMP
  • получить ключ от ARRAY1
  • объединить МАССИВ1 и МАССИВ2

Вы получите ARRAY1 с данными из ARRAY2

$ar1=[...]; //original array 1
$ar2=[...]; //original array 2

// get ID=> key pairs
$kv=[];
foreach($ar1 as $k => $v){
    $kv[ $v['id'] ] = $k;
    }

// loop ARRAY2
foreach($ar2 as $k => $v){
    if( array_key_exists( $v['id'] , $kv ) ){
        $ar1[ $kv[$v['id']] ] = array_merge( $ar1[$kv[$v['id']]] , $ar2[$k] );
        }
    }
29.05.2018
  • Отлично спасибо. С вашим ответом я могу сохранить всю и только длину моего первого массива, объединенную со значениями второго массива, и без необходимости выполнять foreach в foreach, что меня и убило. 29.05.2018

  • 2

    https://eval.in/1011901

     <?php 
    
    $a = [['ID'=> 'TOTO'], ['ID' => 'TATA']];
    $b = [['ID' => 'TATA', 'RA' => 'T'], ['ID' => 'TOTO', 'COUCOU' => 2]];
    
    $final = [];
    
    foreach($a as $c){
      if(!isset($final[$c['ID']])){
        $final[$c['ID']] = $c;
      }else{
        $final[$c['ID']] += $c;
      }
    }
    foreach($b as $c){
      if(!isset($final[$c['ID']])){
        $final[$c['ID']] = $c;
      }else{
        $final[$c['ID']] += $c;
      }
    }
    var_dump(array_values($final));
    

    ВЫВОД

    array(2) {
      [0]=>
      array(2) {
        ["ID"]=>
        string(4) "TOTO"
        ["COUCOU"]=>
        int(2)
      }
      [1]=>
      array(2) {
        ["ID"]=>
        string(4) "TATA"
        ["RA"]=>
        string(1) "T"
      }
    }
    
    29.05.2018
  • Спасибо ! Это было очень близко к тому, что мне нужно! 29.05.2018
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..