3v4l.org

run code in 300+ PHP versions simultaneously
<?php $array = array ( // Sub-array 1 array ( // Story 'Monkey 1' - Has identical sub-sub-arrays 'Monkey 2' and 'Monkey 3' and will be merged with them. array ( "header" => "This is a story about a monkey.", 'keywords' => array( "Trees", "Monkey", "Flying", "Drink", "Vacation", "Coconut", "Big", "Bonobo", "Climbing") ), // Story 'Cat 1' - Has identical sub-sub-array 'Cat 2' and will be merged with it. array ( "header" => "Here's a catarific story about a cat", 'keywords' => array( "meauw", "raaaw", "kitty", "growup", "Fun", "claws", "fish", "salmon") ) ), // Sub-array 2 array ( // Story 'Monkey 2' - Has identical sub-sub-arrays 'Monkey 1' and 'Monkey 3' and will be merged with them. array ( "header" => "This is another, but different story, about a monkey.", 'keywords' => array( "Monkey", "Big", "Trees", "Bonobo", "Fun", "Dance", "Cow", "Coconuts") ), // Story 'Cat 2' - Has identical sub-sub-array 'Cat 1' and will be merged with it. array ( "header" => "Here's a different story about a cat", 'keywords' => array( "meauwe", "ball", "cat", "kitten", "claws", "sleep", "fish", "purr") ) ), // Sub-array 3 array ( // Story 'Monkey 3' - Has identical sub-sub-arrays 'Monkey 1' and 'Monkey 2' and will be merged with them. array ( "header" => "This is a third story about a monkey.", 'keywords' => array( "Jungle", "tree", "monkey", "Bonobo", "Fun", "Dance", "climbing", "Coconut", "pretty") ), // Story 'Fireman 1' - Has no identical sub-sub-arrays and will not be merged. array ( "header" => "This is a story about a fireman", 'keywords' => array( "fire", "explosion", "burning", "rescue", "happy", "help", "water", "car") ) ) ); //flatten array to make it simpler $new =[]; foreach($array as $subarr){ $new = array_merge($new, $subarr); } $threshold = 3; $lev_point_value = 1; $merged=[]; foreach($new as $key => $story){ $word_count = 0; // create regex pattern to find similar items $words = "/" . implode("|", $story["keywords"]) . "/i"; foreach($new as $key2 => $story2){ // only loop new items and items that has not been merged already if($key != $key2 && $key2 > $key && !in_array($key2, $merged)){ foreach ($story['keywords'] as $item1){ foreach ($story2["keywords"] as $item2){ if (levenshtein($item1, $item2) <= $lev_point_value) { $word_count++; // If the count of words from preg_grep is above threshold it's mergable if($word_count >= $threshold){ // debug //echo $key . " " . $key2 . "\n"; //echo $story["header"] . " = " . $story2["header"] ."\n\n"; // if the item does not exist create it first to remove notices if(!isset($res[$key])) $res[$key] = ["header" => [], "keywords" =>[]]; // add headers $res[$key]["header"][] = $story["header"]; $res[$key]["header"][] = $story2["header"]; // only keep unique $res[$key]["header"] = array_unique($res[$key]["header"]); // add keywords and remove duplicates $res[$key]["keywords"] = array_merge($res[$key]["keywords"], $story["keywords"], $story2["keywords"]); $res[$key]["keywords"] = array_unique($res[$key]["keywords"]); // add key2 to merged so that we don't merge this again. $merged[] = $key2; } } } } } } } var_dump($new);
Output for 7.1.0 - 7.1.33, 7.2.0 - 7.2.33, 7.3.0 - 7.3.33, 7.4.0 - 7.4.33, 8.0.0 - 8.0.30, 8.1.0 - 8.1.28, 8.2.0 - 8.2.18, 8.3.0 - 8.3.4, 8.3.6
array(6) { [0]=> array(2) { ["header"]=> string(31) "This is a story about a monkey." ["keywords"]=> array(9) { [0]=> string(5) "Trees" [1]=> string(6) "Monkey" [2]=> string(6) "Flying" [3]=> string(5) "Drink" [4]=> string(8) "Vacation" [5]=> string(7) "Coconut" [6]=> string(3) "Big" [7]=> string(6) "Bonobo" [8]=> string(8) "Climbing" } } [1]=> array(2) { ["header"]=> string(36) "Here's a catarific story about a cat" ["keywords"]=> array(8) { [0]=> string(5) "meauw" [1]=> string(5) "raaaw" [2]=> string(5) "kitty" [3]=> string(6) "growup" [4]=> string(3) "Fun" [5]=> string(5) "claws" [6]=> string(4) "fish" [7]=> string(6) "salmon" } } [2]=> array(2) { ["header"]=> string(53) "This is another, but different story, about a monkey." ["keywords"]=> array(8) { [0]=> string(6) "Monkey" [1]=> string(3) "Big" [2]=> string(5) "Trees" [3]=> string(6) "Bonobo" [4]=> string(3) "Fun" [5]=> string(5) "Dance" [6]=> string(3) "Cow" [7]=> string(8) "Coconuts" } } [3]=> array(2) { ["header"]=> string(36) "Here's a different story about a cat" ["keywords"]=> array(8) { [0]=> string(6) "meauwe" [1]=> string(4) "ball" [2]=> string(3) "cat" [3]=> string(6) "kitten" [4]=> string(5) "claws" [5]=> string(5) "sleep" [6]=> string(4) "fish" [7]=> string(4) "purr" } } [4]=> array(2) { ["header"]=> string(37) "This is a third story about a monkey." ["keywords"]=> array(9) { [0]=> string(6) "Jungle" [1]=> string(4) "tree" [2]=> string(6) "monkey" [3]=> string(6) "Bonobo" [4]=> string(3) "Fun" [5]=> string(5) "Dance" [6]=> string(8) "climbing" [7]=> string(7) "Coconut" [8]=> string(6) "pretty" } } [5]=> array(2) { ["header"]=> string(31) "This is a story about a fireman" ["keywords"]=> array(8) { [0]=> string(4) "fire" [1]=> string(9) "explosion" [2]=> string(7) "burning" [3]=> string(6) "rescue" [4]=> string(5) "happy" [5]=> string(4) "help" [6]=> string(5) "water" [7]=> string(3) "car" } } }
Output for 8.3.5
Warning: PHP Startup: Unable to load dynamic library 'sodium.so' (tried: /usr/lib/php/8.3.5/modules/sodium.so (libsodium.so.23: cannot open shared object file: No such file or directory), /usr/lib/php/8.3.5/modules/sodium.so.so (/usr/lib/php/8.3.5/modules/sodium.so.so: cannot open shared object file: No such file or directory)) in Unknown on line 0 array(6) { [0]=> array(2) { ["header"]=> string(31) "This is a story about a monkey." ["keywords"]=> array(9) { [0]=> string(5) "Trees" [1]=> string(6) "Monkey" [2]=> string(6) "Flying" [3]=> string(5) "Drink" [4]=> string(8) "Vacation" [5]=> string(7) "Coconut" [6]=> string(3) "Big" [7]=> string(6) "Bonobo" [8]=> string(8) "Climbing" } } [1]=> array(2) { ["header"]=> string(36) "Here's a catarific story about a cat" ["keywords"]=> array(8) { [0]=> string(5) "meauw" [1]=> string(5) "raaaw" [2]=> string(5) "kitty" [3]=> string(6) "growup" [4]=> string(3) "Fun" [5]=> string(5) "claws" [6]=> string(4) "fish" [7]=> string(6) "salmon" } } [2]=> array(2) { ["header"]=> string(53) "This is another, but different story, about a monkey." ["keywords"]=> array(8) { [0]=> string(6) "Monkey" [1]=> string(3) "Big" [2]=> string(5) "Trees" [3]=> string(6) "Bonobo" [4]=> string(3) "Fun" [5]=> string(5) "Dance" [6]=> string(3) "Cow" [7]=> string(8) "Coconuts" } } [3]=> array(2) { ["header"]=> string(36) "Here's a different story about a cat" ["keywords"]=> array(8) { [0]=> string(6) "meauwe" [1]=> string(4) "ball" [2]=> string(3) "cat" [3]=> string(6) "kitten" [4]=> string(5) "claws" [5]=> string(5) "sleep" [6]=> string(4) "fish" [7]=> string(4) "purr" } } [4]=> array(2) { ["header"]=> string(37) "This is a third story about a monkey." ["keywords"]=> array(9) { [0]=> string(6) "Jungle" [1]=> string(4) "tree" [2]=> string(6) "monkey" [3]=> string(6) "Bonobo" [4]=> string(3) "Fun" [5]=> string(5) "Dance" [6]=> string(8) "climbing" [7]=> string(7) "Coconut" [8]=> string(6) "pretty" } } [5]=> array(2) { ["header"]=> string(31) "This is a story about a fireman" ["keywords"]=> array(8) { [0]=> string(4) "fire" [1]=> string(9) "explosion" [2]=> string(7) "burning" [3]=> string(6) "rescue" [4]=> string(5) "happy" [5]=> string(4) "help" [6]=> string(5) "water" [7]=> string(3) "car" } } }

preferences:
163.68 ms | 409 KiB | 192 Q