How to return array with true/false values comparing 2 arrays?
Arrays are fun!
PHP has a TON of array functions, and so there's lots of potential solutions.
I came up with this one as a personal challenge, which uses no loops, filters, or maps.
This solution uses array_intersect to find values that exist in both arrays, then array_values along with array_fill_keys to turn them into associative arrays populated with TRUE
or FALSE
, and finally array_merge to put them together into a single array:
$array1 = array( 0 => "car1", 1 => "car2", 2 => "car3", 3 => "car4", 4 => "car5");$array2 = array( 0 => "car1", 1 => "car4", 2 => "car5" );// Find all values that exist in both arrays$intersect = array_intersect( $array1, $array2 );// Turn it into an associative array with TRUE values$intersect = array_fill_keys( array_values($intersect), TRUE );// Turn the original array into an associative array with FALSE values$array1 = array_fill_keys( array_values( $array1 ), FALSE );// Merge / combine the arrays - $intersect MUST be second so that TRUE values override FALSE values$results = array_merge( $array1, $intersect );
var_dump( $results );
results in:
array (size=5) 'car1' => boolean true 'car2' => boolean false 'car3' => boolean false 'car4' => boolean true 'car5' => boolean true
array_map
or array_combine
does not actually return what you want. If you wanted to use array_map
to the desired effect without writing a foreach loop, below gives you the desired result. Note you have to pass array3
as a reference.
<?php $array1 = array( 0 => "car1", 1 => "car2", 2 => "car3", 3 => "car4", 4 => "car5");$array2 = array( 0 => "car1", 1 => "car4", 2 => "car5" );$array3 = [];array_map(function($a) use ($array2, &$array3) { $array3[$a] = in_array($a, array_values($array2));}, $array1);var_dump($array3);
Output:
array(5) { ["car1"]=> bool(true) ["car2"]=> bool(false) ["car3"]=> bool(false) ["car4"]=> bool(true) ["car5"]=> bool(true)}
This is slow, but it should do what you want, and be easy to understand.
// Loop over the outer array which we're told has all the categories$result = array();foreach($array1 as $sCar1) { $found = false; // Loop over the categories of the post foreach($array2 as $sCar2) { // If the current post category matches // the current category we're searching for // note it and move on if($sCar2 == $sCar1) { $found = true; break; } } // Now indicate in the result if the post has the current category $result[$sCar1] = $found;}