3v4l.org

run code in 300+ PHP versions simultaneously
<?php $test1 = [ "blah1", "blah1", "blah2", "blah4", "blah5" ]; $test2 = [ "blah1", // under-represented "blah2", // equally found "blah3", // not found "blah4", // over-represented "blah4", // " ]; function removeBValuesFromA(array $a, array $b): array { foreach ($b as $bVal) { $k = array_search($bVal, $a); if ($k !== false) { unset($a[$k]); } } return array_values($a); } function bidirectionalDiff(array $a, array $b): array { foreach ($b as $bKey => $bVal) { $aKey = array_search($bVal, $a); if ($aKey !== false) { unset($a[$aKey], $b[$bKey]); } } return array_merge($a, $b); } function removeBValuesFromAViaCounts(array $a, array $b): array { $toRemove = array_count_values($b); $result = []; foreach (array_count_values($a) as $k => $count) { array_push( $result, ...array_fill( 0, max(0, $count - ($toRemove[$k] ?? 0)), $k ) ); } return $result; } function bidirectionalDiffViaCounts(array $a, array $b): array { $bCounts = array_count_values($b); $result = []; foreach (array_count_values($a) as $k => $count) { array_push( $result, ...array_fill( 0, abs($count - ($bCounts[$k] ?? 0)), $k ) ); unset($bCounts[$k]); } foreach ($bCounts as $k => $count) { array_push( $result, ...array_fill(0, $count, $k) ); } return $result; } var_export([ 'removeBValuesFromA' => removeBValuesFromA($test1, $test2), 'bidirectionalDiff' => bidirectionalDiff($test1, $test2), 'removeBValuesFromAViaCounts' => removeBValuesFromAViaCounts($test1, $test2), 'bidirectionalDiffViaCounts' => bidirectionalDiffViaCounts($test1, $test2), ]);
Output for 8.0.1 - 8.0.30, 8.1.0 - 8.1.33, 8.2.0 - 8.2.29, 8.3.0 - 8.3.27, 8.4.1 - 8.4.14
array ( 'removeBValuesFromA' => array ( 0 => 'blah1', 1 => 'blah5', ), 'bidirectionalDiff' => array ( 0 => 'blah1', 1 => 'blah5', 2 => 'blah3', 3 => 'blah4', ), 'removeBValuesFromAViaCounts' => array ( 0 => 'blah1', 1 => 'blah5', ), 'bidirectionalDiffViaCounts' => array ( 0 => 'blah1', 1 => 'blah4', 2 => 'blah5', 3 => 'blah3', ), )

preferences:
95.94 ms | 407 KiB | 5 Q