note 87740 modified in function.array-count-values by felipe

From: Date: Sun, 28 Dec 2008 13:35:45 +0000
Subject: note 87740 modified in function.array-count-values by felipe
References: 1  Groups: php.notes 
Request: Send a blank email to php-notes+get-148609@lists.php.net to get a copy of this message
This doesn't seem to be documented, but it appears that array_count_values will write its key values *back* to corresponding values in the argument array. For example, say I have an array $id_numbers, consisting of 7 digits which contain leading zeros (so number 1 would be 0000001 and so on). Most probably already know that array_count_values will (lamely, IMO) strip the leading zeros and return the key as a number. So if <?php $id_numbers[0] = 0056789; $id_numbers[1] = 0012345; $id_numbers[2] = 0012345; // then $id_counts = array_count_values($id_numbers); // will yield $id_counts[56789] = 1; $id_counts[12345] = 2; /* That's not the weird part yet. If you dump $id_numbers you get an interesting result: */ $id_numbers[0] = 56789; $id_numbers[1] = 12345; $id_numbers[2] = 12345; ?> Obviously quite nasty, if you aren't careful. The way to prevent this is to encapsulate the argument array in the array_values() function: $id_counts = array_count_values(array_values($id_numbers)) You'll still have the nagging problem that your $id_counts keys are still technically incorrect, but depending on your program or incoming data, a sprintf() should rectify the stripping of zeros (i.e. you basically have to make the array_count_values result a "temporary" array, then loop through that, restore the zeros and populate a new "real" array with correct keys) --was-- This doesn't seem to be documented, but it appears that array_count_values will write its key values *back* to corresponding values in the argument array. For example, say I have an array $id_numbers, consisting of 7 digits which contain leading zeros (so number 1 would be 0000001 and so on). Most probably already know that array_count_values will (lamely, IMO) strip the leading zeros and return the key as a number. So if $id_numbers[0] = 0056789 $id_numbers[1] = 0012345 $id_numbers[2] = 0012345 then $id_counts = array_count_values($id_numbers) will yield $id_counts[56789] = 1 $id_counts[12345] = 2 That's not the weird part yet. If you dump $id_numbers you get an interesting result: $id_numbers[0] = 56789 $id_numbers[1] = 12345 $id_numbers[2] = 12345 Obviously quite nasty, if you aren't careful. The way to prevent this is to encapsulate the argument array in the array_values() function: $id_counts = array_count_values(array_values($id_numbers)) You'll still have the nagging problem that your $id_counts keys are still technically incorrect, but depending on your program or incoming data, a sprintf() should rectify the stripping of zeros (i.e. you basically have to make the array_count_values result a "temporary" array, then loop through that, restore the zeros and populate a new "real" array with correct keys) http://php.net/manual/en/function.array-count-values.php

« previous php.notes (#148609) next »