首页 > 解决方案 > 在 PHP 中加入两个关联数组

问题描述

我有两个关联数组,一个叫做 $events,一个叫做 $wikipedia。
我想要一种有效的方法将 $wikipedia 中的“extract”和“thumbnail”加入到 $events 中,其中 $events 中的“name”与 $wikipedia 中的“title”匹配。

原始 $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);
            }
        }
        
    }

标签: phpassociative-array

解决方案


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

改进解决方案的最简单方法是通过创建以标题/名称为键的关联数组,预先从原始数据生成查找表。之后进行合并时,查找会很快(并且不会因为更多条目而变慢)。

您只循环两次而不是 n*m 次。这将导致线性运行时间上)

$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);
  }
}

如果你有很多数据并且需要保留空间,你可以将项目的索引存储在查找表中,或者在将它们添加到查找表后从原始数组中删除数据。


推荐阅读