在 PHP 中连接两个关联数组

Join two associative arrays in PHP

我有两个关联数组,一个叫做 $events,一个叫做 $wikipedia。
我想要一种有效的方法将 $wikipedia 中的“提取”和“缩略图”加入 $events,其中 $events 中的“名称”与 $wikipedia 中的“标题”相匹配。

原始 $events

$events = Array
(
    [0] => Array
        (
            [id] => 0
            [name] => Human
            [start] => 123
        )

    [1] => Array
        (
            [id] => 1
            [name] => Neanderthal
            [start] => 456
        )

    [2] => Array
        (
            [id] => 2
            [name] => Denisovan
            [start] => 456
        )

)

$维基百科

$wiki = Array
(
    [26685803] => Array
        (
            [pageid] => 26685803
            [ns] => 0
            [title] => Denisovan
            [thumbnail] => Array
                (
                    [source] => https://upload.wikimedia.org/wikipedia/commons/thumb/c/ca/Denisova_4_Denisovan_molar_3.jpg/133px-Denisova_4_Denisovan_molar_3.jpg
                    [width] => 133
                    [height] => 200
                )

            [extract] => The Denisovans or Denisova hominins (  di-NEE-sə-və) are an extinct species or subspecies of archaic human that ranged across Asia during the Lower and Middle Paleolithic. Denisovans are known from few remains, and, consequently, most of what is known about them comes from DNA evidence. Pending consensus on their taxonomic status, they have been referred...
        )

    [682482] => Array
        (
            [pageid] => 682482
            [ns] => 0
            [title] => Human
            [thumbnail] => Array
                (
                    [source] => https://upload.wikimedia.org/wikipedia/commons/thumb/6/68/Akha_cropped_hires.JPG/119px-Akha_cropped_hires.JPG
                    [width] => 119
                    [height] => 200
                )

            [extract] => Humans (Homo sapiens) are a species of highly intelligent primates. They are the only extant members of the subtribe Hominina and—together with chimpanzees, gorillas, and orangutans—are part of the family Hominidae (the great apes, or hominids). Humans are terrestrial animals, characterized by their erect posture and bipedal locomotion; high manual...
        )

    [27298083] => Array
        (
            [pageid] => 27298083
            [ns] => 0
            [title] => Neanderthal
            [thumbnail] => Array
                (
                    [source] => https://upload.wikimedia.org/wikipedia/commons/thumb/d/d4/Range_of_NeanderthalsAColoured.png/200px-Range_of_NeanderthalsAColoured.png
                    [width] => 200
                    [height] => 95
                )

            [extract] => Neanderthals (, also Neandertals, Homo neanderthalensis or Homo sapiens neanderthalensis) are an extinct species or subspecies of archaic humans who lived in Eurasia until about 40,000 years ago. They most likely went extinct due to great climatic change, disease, or a combination of these factors.It is unclear when Neanderthals split from modern humans...
        )

)

使用来自$wikipedia

的数据修改了$events
$events = Array
(
    [0] => Array
        (
            [id] => 0
            [name] => Human
            [start] => 123
            [thumbnail] => Array
                (
                    [source] => https://upload.wikimedia.org/wikipedia/commons/thumb/6/68/Akha_cropped_hires.JPG/119px-Akha_cropped_hires.JPG
                    [width] => 119
                    [height] => 200
                )

            [extract] => Humans (Homo sapiens) are a species of highly intelligent primates. They are the only extant members of the subtribe Hominina and—together with chimpanzees, gorillas, and orangutans—are part of the family Hominidae (the great apes, or hominids). Humans are terrestrial animals, characterized by their erect posture and bipedal locomotion; high manual...
        )

    [1] => Array
        (
            [id] => 1
            [name] => Neanderthal
            [start] => 456
            [thumbnail] => Array
                (
                    [source] => https://upload.wikimedia.org/wikipedia/commons/thumb/d/d4/Range_of_NeanderthalsAColoured.png/200px-Range_of_NeanderthalsAColoured.png
                    [width] => 200
                    [height] => 95
                )

            [extract] => Neanderthals (, also Neandertals, Homo neanderthalensis or Homo sapiens neanderthalensis) are an extinct species or subspecies of archaic humans who lived in Eurasia until about 40,000 years ago. They most likely went extinct due to great climatic change, disease, or a combination of these factors.It is unclear when Neanderthals split from modern humans...
        )

    [2] => Array
        (
            [id] => 2
            [name] => Denisovan
            [start] => 456
            [thumbnail] => Array
                (
                    [source] => https://upload.wikimedia.org/wikipedia/commons/thumb/c/ca/Denisova_4_Denisovan_molar_3.jpg/133px-Denisova_4_Denisovan_molar_3.jpg
                    [width] => 133
                    [height] => 200
                )

            [extract] => The Denisovans or Denisova hominins (  di-NEE-sə-və) are an extinct species or subspecies of archaic human that ranged across Asia during the Lower and Middle Paleolithic. Denisovans are known from few remains, and, consequently, most of what is known about them comes from DNA evidence. Pending consensus on their taxonomic status, they have been referred...
        )

)

我试过的
我可以通过嵌套的 foreach 循环来实现这一点。然而,这似乎不是很有效,因为我必须迭代 $wikipedia 数组中的每个元素。不知道有没有更好的办法

    $arr = array();
    foreach($events as $event){
        foreach($wiki as $w){
            if ($w['title'] == $event['name']){
                $event['extract'] = $w['extract'];
                $event['thumbnail'] = $w['thumbnail'];
                array_push($arr, $event);
            }
        }
        
    }

有一种更有效的方法。您的解决方案将具有 O(n^2) 运行时。如果您需要加入多个项目,那就不太好了。

改进解决方案的最简单方法是通过创建一个以 title/name 为键的关联数组,预先从原始数据生成查找 table。之后进行合并时,查找会很快(并且不会随着条目的增加而变慢)。

你只循环了两次而不是n*m次。这将导致线性运行时间 O(n)

$lookup = [];
$arr = [];
foreach($events as $event){
   $lookup[$event['name']] = $event;
}
foreach($wiki as $w){
  $event = $lookup[$w['title']];
  if($event) {
     $event['extract'] = $w['extract'];
     $event['thumbnail'] = $w['thumbnail'];
     array_push($arr, $event);
  }
}

如果你有很多数据需要保留space,你可以在查找中存储该项的索引table或者在将它们添加到之后从原始数组中删除数据查找 table.

重新映射有助于避免循环:

$map = array_column($wiki, null, 'title'); # remap the array

foreach ($events as ['id' => $id, 'name' => $name])
{
    $events[$id]['extract']   = $map[$name]['extract'];
    $events[$id]['thumbnail'] = $map[$name]['thumbnail'];
}