How to return array with true/false values comparing 2 arrays? How to return array with true/false values comparing 2 arrays? wordpress wordpress

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