Julian Paolo Dayag
Julian Paolo Dayag

Reputation: 3739

PHP compare two arrays and get the matched values not the difference

I'm trying to compare two arrays and get only the values that exist on both arrays but, unfortunately, I can't find the right array function to use...

I found the array_diff() function: http://php.net/manual/en/function.array-diff.php

But it's for the difference of the both arrays.

Example:

$array1 = array("**alpha**","omega","**bravo**","**charlie**","**delta**","**foxfrot**");
$array2 = array("**alpha**","gamma","**bravo**","x-ray","**charlie**","**delta**","halo","eagle","**foxfrot**");

Expected Output:

$result = array("**alpha**","**bravo**","**charlie**","**delta**","**foxfrot**");

Upvotes: 39

Views: 138409

Answers (3)

Lonare
Lonare

Reputation: 4703

I think the better answer for this questions is

array_diff() 

because it Compares array against one or more other arrays and returns the values in array that are not present in any of the other arrays.

Whereas

array_intersect() returns an array containing all the values of array that are present in all the arguments. Note that keys are preserved.

Upvotes: 0

Bill Warren
Bill Warren

Reputation: 392

OK.. We needed to compare a dynamic number of product names...

There's probably a better way... but this works for me...

... because....Strings are just Arrays of characters.... :>}

//  Compare Strings ...  Return Matching Text and Differences with Product IDs...

//  From MySql...
$productID1 = 'abc123';
$productName1 = "EcoPlus Premio Jet 600";   

$productID2 = 'xyz789';
$productName2 = "EcoPlus Premio Jet 800";   

$ProductNames = array(
    $productID1 => $productName1,
    $productID2 => $productName2
);


function compareNames($ProductNames){   

    //  Convert NameStrings to Arrays...    
    foreach($ProductNames as $id => $product_name){
        $Package1[$id] = explode(" ",$product_name);    
    }

    // Get Matching Text...
    $Matching = call_user_func_array('array_intersect', $Package1 );
    $MatchingText = implode(" ",$Matching);

    //  Get Different Text...
    foreach($Package1 as $id => $product_name_chunks){
        $Package2 = array($product_name_chunks,$Matching);
        $diff = call_user_func_array('array_diff', $Package2 );
        $DifferentText[$id] = trim(implode(" ", $diff));
    }

    $results[$MatchingText]  = $DifferentText;              
    return $results;    
}

$Results =  compareNames($ProductNames);

print_r($Results);

// Gives us this...
[EcoPlus Premio Jet] 
        [abc123] => 600
        [xyz789] => 800

Upvotes: 2

Alix Axel
Alix Axel

Reputation: 154681

Simple, use array_intersect() instead:

$result = array_intersect($array1, $array2);

Upvotes: 105

Related Questions