-
-
Save nunoveloso/1992851 to your computer and use it in GitHub Desktop.
| /** | |
| * Home mande method to do array_diff ~10x faster that PHP built-in. | |
| * | |
| * @param The array to compare from | |
| * @param An array to compare against | |
| * | |
| * @return an array containing all the entries from array1 that are not present in array2. | |
| */ | |
| function nuno_array_diff($array1, $array2) { | |
| $diff = array(); | |
| // we don't care about keys anyway + avoids dupes | |
| foreach ($array1 as $value) { | |
| $diff[$value] = 1; | |
| } | |
| // unset common values | |
| foreach ($array2 as $value) { | |
| unset($diff[$value]); | |
| } | |
| return array_keys($diff); | |
| } | |
| /** | |
| * Home mande method to do array_intersect ~10x faster that PHP built-in. | |
| * | |
| * @param The array to compare from | |
| * @param An array to compare against | |
| * | |
| * @return an array containing all the entries from array1 that are present in array2. | |
| */ | |
| function nuno_array_intersect($array1, $array2) { | |
| $a1 = $a2 = array(); | |
| // we don't care about keys anyway + avoids dupes | |
| foreach ($array1 as $value) { | |
| $a1[$value] = $value; | |
| } | |
| foreach ($array2 as $value) { | |
| $a2[$value] = 1; | |
| } | |
| // unset different values values | |
| foreach ($a1 as $value) { | |
| if (!isset($a2[$value])) { | |
| unset($a1[$value]); | |
| } | |
| } | |
| return array_keys($a1); | |
| } |
It is nice, aslong you are not goging to compare arrays with numbers as string in it, or with floats, or floats with the lovely exponent letter...
Otherwise you might either run into a type juggling problem later because the returned value will be an integer and not a string anymore as it was in the original array, or you'll have a floating point issue or a key that is an int.
Example for these problems using the intersect function:
$a1 = ['123', 12.34, 1e23, 2.0]; $a2 = [123, 12, "1.0E+23", 200376420512301056, 8.5-6.4-0.1]; $resMain = array_intersect($a1, $a2) $resNuno = nuno_array_intersect($a1, $a2);
So handle with care!
Use for non numeric strings to prevent type juggling or arrays that contains integers.
Don't use for floats or strings of numbers!
Maybe a solution could be to add a prefix ('_'.$value) to the keys, when the values get used as key. It is a bit hacky, but in this way you force php to keep all as string, so it compares all as string.
In the last foreach do isset('_'.$value) instead !isset() and add the result there to an array instead of using array_keys().
Should give then almost the same results as array_unique(array_inteesect()) I think, but I didn't checked the performance. For doing more equal, check in the first foreach if the key isset()
Thanks for code!