Evgenij Reznik
Evgenij Reznik

Reputation: 18614

Join 2 arrays by key

Suppose I have 2 arrays:

$arr1 = array (
        array (
                "animal" => "cat",
                "color" => "grey" 
        ),
        array (
                "animal" => "dog",
                "color" => "black" 
        ),
        array (
                "animal" => "mouse",
                "color" => "white" 
        ) 
);

$arr2 = array (
        array (
                "title" => "mouse",
                "name" => "Abby" 
        ),
        array (
                "title" => "dog",
                "name" => "Rex" 
        ),
        array (
                "title" => "dog",
                "name" => "Barney" 
        ),
        array (
                "title" => "mouse",
                "name" => "Georgie" 
        ) 
);

I now want to join them by key (animal from $arr1 and title from $arr2) so that I have:

$arr1 = array (
        array (
                "animal" => "cat",
                "color" => "grey" 
        ),
        array (
                "animal" => "dog",
                "color" => "black",
                "name" => "Rex",
                "name" => "Barney" 
        ),
        array (
                "animal" => "mouse",
                "color" => "white",
                "name" => "Abby",
                "name" => "Georgie" 
        ) 
);

So just add the names of dog and mouse from $arr2.

My solution was:

foreach ( $arr1 as $key1 => $entry1 ) {
    foreach ( $arr2 as $key2 => $entry2 ) {
        if ($entry1 ["animal"] == $entry2 ["title"]) {
            $arr1 [$key1] ["name"] = $entry2 ["name"];
        }
    }
}

But it overwrites the first entry and so that I only get the last names:

$arr1 = array (
        array (
                "animal" => "cat",
                "color" => "grey" 
        ),
        array (
                "animal" => "dog",
                "color" => "black",
                "name" => "Barney"
        ),
        array (
                "animal" => "mouse",
                "color" => "white",
                "name" => "Georgie"
        ) 
);

I looked at array_merge(), but it just merges the arrays without comparing their keys.

Upvotes: 1

Views: 67

Answers (1)

Halayem Anis
Halayem Anis

Reputation: 7805

So name index must be an array :)

try as follow

foreach ( $arr1 as $key1 => $entry1 ) {
    foreach ( $arr2 as $key2 => $entry2 ) {
        if ($entry1 ["animal"] == $entry2 ["title"]) {
            if (!isset($arr1[$key1]["name"])) {
                $arr1[$key1]["name"] = array();
            }
            $arr1 [$key1]["name"][] = $entry2 ["name"];
        }
    }
}

OUTPUT

$arr1 = array (
            array (
                    "animal" => "cat",
                    "color" => "grey" 
            ),
            array (
                    "animal" => "dog",
                    "color" => "black",
                    "name" => ["Rex", "Barney" ] 
            ),
            array (
                    "animal" => "mouse",
                    "color" => "white",
                    "name" => ["Abby", "Georgie"]
            ) 
);

Upvotes: 2

Related Questions