Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Count how many times a value occurs in an array

16 views
Skip to first unread message

Ryan

unread,
Sep 27, 2012, 2:25:21 AM9/27/12
to
I have an array lets say for example:

$my_array = array('1', '1', '2', '3', '1', '3', '2');

I want a listing of each value in the array and how many times it occurs for in this case it would look like this

array ('1' => 3, '2' => 2, '3' => 2)

jw if ph has a build in function to make this easy of am I going to have to roll my own by looping though the array?

aro...@gmail.com

unread,
Sep 27, 2012, 3:10:08 AM9/27/12
to
Use built-in function: array_count_values($my_array)

Captain Paralytic

unread,
Sep 27, 2012, 6:48:55 AM9/27/12
to
On Sep 27, 7:25 am, Ryan <rbile...@gmail.com> wrote:
>
> jw if ph has a build in function to make this easy of am I going to have to roll my own by looping though the array?

Care to explain what the above is supposed to mean?

Erwin Moller

unread,
Sep 27, 2012, 7:08:12 AM9/27/12
to
jw probably means: Just wondering
ph probably means PHP

The remainder is reasonably clear (I think).

Regards,
Erwin Moller

--
"That which can be asserted without evidence, can be dismissed without
evidence."
-- Christopher Hitchens

M. Strobel

unread,
Sep 27, 2012, 12:19:06 PM9/27/12
to
Am 27.09.2012 13:08, schrieb Erwin Moller:
> On 9/27/2012 12:48 PM, Captain Paralytic wrote:
>> On Sep 27, 7:25 am, Ryan <rbile...@gmail.com> wrote:
>>>
>>> jw if ph has a build in function to make this easy of am I going to have to roll
>>> my own by looping though the array?
>>
>> Care to explain what the above is supposed to mean?
>>
>
> jw probably means: Just wondering
> ph probably means PHP
>

I hope (for him) the OP does not program the same way he is writing.

/Str.

Message has been deleted
Message has been deleted

M. Strobel

unread,
Sep 27, 2012, 1:43:51 PM9/27/12
to
Am 27.09.2012 19:14, schrieb Ryan:
> Oh so will arra_count_values not work? lol that's what I get for typing tired. Fortunately for me my IDE will highlight any errors lol.
>
> On a more serious note though I have noticed one limitation. It will no go into sub arrays. So when I query my DB it will actually come up like this
>
> array (array(1), array(1), array (2)) ect. So what would be the best way to deal with this, is there a way to go though and clean it up by removing the nested arrays and replacing them with integers or even a literal string would work for me.
>
> I suppose if all else fails I could just loop though the primary array and implode each sub array.

Yes you get an array of arrays from a database query.

PHP has a ton of functions... let's see... I would use array_walk_recursive().

Be careful with call-by-reference, it is not allowed in the newest PHP versions.

/Str.

Christoph Becker

unread,
Sep 27, 2012, 2:07:41 PM9/27/12
to
M. Strobel wrote:
> Be careful with call-by-reference, it is not allowed in the newest PHP versions.

Only the call-time call-by-reference was deprecated in 5.3 and removed
in 5.4. Declaring a parameter of a function as reference is absolutely
fine.

E.g.:

function increase(&$n)
{
$n++;
}

$i = 1; increase($i); // $i == 2
$i = 1; increase(&$i); // fatal error in PHP 5.4

--
Christoph M. Becker

M. Strobel

unread,
Sep 27, 2012, 5:52:14 PM9/27/12
to
Yes, but I had a problem with callback functions: if you created them with
create_function this was a call-time call-by-reference.


/Str.

Christoph Becker

unread,
Sep 27, 2012, 6:07:10 PM9/27/12
to
M. Strobel wrote:
> Yes, but I had a problem with callback functions: if you created them with
> create_function this was a call-time call-by-reference.

Could you please give an example. For example

array_walk($array, create_function('&$x', '$x = trim($x);'));

works fine.

--
Christoph M. Becker

Jerry Stuckle

unread,
Sep 27, 2012, 6:26:46 PM9/27/12
to
On 9/27/2012 1:14 PM, Ryan wrote:
> On Thursday, September 27, 2012 9:19:08 AM UTC-7, M. Strobel wrote:
> Oh so will arra_count_values not work? lol that's what I get for typing tired. Fortunately for me my IDE will highlight any errors lol.
>
> On a more serious note though I have noticed one limitation. It will no go into sub arrays. So when I query my DB it will actually come up like this
>
> array (array(1), array(1), array (2)) ect. So what would be the best way to deal with this, is there a way to go though and clean it up by removing the nested arrays and replacing them with integers or even a literal string would work for me.
>
> I suppose if all else fails I could just loop though the primary array and implode each sub array.
>

If it's coming from a database, just let the database gives you the counts.

--
==================
Remove the "x" from my email address
Jerry Stuckle
JDS Computer Training Corp.
jstu...@attglobal.net
==================

M. Strobel

unread,
Sep 28, 2012, 4:04:39 AM9/28/12
to
My requirement was not to change the array, but to return data from inside the callback.

In older PHP you could ignore the warning about Call-time pass-by-reference and give
the callback function a third parameter by ref.

Now there is only one way to do it, see the command line test code below.

/Str.

<?php
/**
* Testen von array_walk mit Closure und use-Parameter by reference
*/

error_reporting(-1);

$sub1 = array('I'=>'Igor', 'J'=>'Jan', 'K'=>'Karl', 'L'=>'Liugi', 'M'=>'Michael');
$sub2 = array('A'=>'Alexa', 'B'=>'Brunhilda','C'=>'Carla','D'=>'Dina','E'=>'Elsa');
$a['F'] = 'Frantzi';
$a['G'] = 'Gustavo';
$a['Gentlemen'] = $sub1;
$a['H'] = 'Hillbilly';
$a['Ladies'] = $sub2;

echo "Number of elements using count(): ", count($a), PHP_EOL;

echo (array_key_exists('K', $a)) ? 'array_key_exists() does work in
sub-arrays':'array_key_exists() does NOT work in sub-arrays', PHP_EOL;


echo '------------------------------', PHP_EOL;
echo "\tStart run\n";
echo '------------------------------', PHP_EOL;

/**
* try a call by ref in a closure use list
*
* This is the best solution to return values from the callback.
*/
$f0 = function ($v,$k,$l) use(&$var) {
if ($k==$l) $var = $v;
};

$var = 'something';
echo "var before array_walk: ($var)\n";
# this does work, var will be defined: unset($var);
$rc = array_walk_recursive($a, $f0, 'M');

echo "rc = $rc, var after array_walk f0 with call by ref in use list: ($var)\n";
echo '------------------------------', PHP_EOL;

/**
* testing f0 in a different scope
*/
function func0($arr,$callback) {
$var = 'Testing in a local scope with f0';
echo "var before array_walk: ($var)\n";
$rc = array_walk_recursive($arr, $callback, 'M');
return ($rc) ? 'Call successful, var is '.$var : 'Call NOT successful, var is
'.$var ;
}

echo func0($a,$f0), PHP_EOL;
echo "Variable in global scope after call: $var\n";
echo "Result: the var by ref in the use list binds to the global scope where it was
defined.\n";

/**
* trying to put a call by ref into the parameter list
*/

$f1 = function ($v,$k,$l, &$var) {
if ($k==$l) $var = $v;
};

$var = 'Test Closure f1';
echo "var before array_walk: ($var)\n";
# this does work, var will be defined: unset($var);
$rc = array_walk_recursive($a, $f1, 'L', $var);

echo "rc = $rc, var after array_walk f1 with call by ref in parameter list: ($var)\n";
echo "We can only pass 1 extra parameter into the callback, f1 does not work\n";
echo '------------------------------', PHP_EOL;

/**
* the idea is to test if we have call by ref in a closure parameter
*/
$f2 = function ($v,$k, &$var) {
if ($k=='I') $var = $v;
};

$var = 'Test Closure f2';
echo "var before array_walk: ($var)\n";
$rc = array_walk_recursive($a, $f2, $var);

echo "rc = $rc, var after array_walk f2 with call by ref in parameter list: ($var)\n";
#echo "We can only pass 1 extra parameter into the callback, f1 does not work\n";
echo '------------------------------', PHP_EOL;

echo <<<EOD
Result for Closure as callback in array_walk:

We can pass variables by ref in the use() parameter list, and only there.
This is the way to return results.

The callback invocation supports one more variable or value, after value and key.

EOD
;

Captain Paralytic

unread,
Sep 28, 2012, 10:35:35 AM9/28/12
to
On Sep 27, 12:08 pm, Erwin Moller <erwinmolleruse...@xs4all.nl> wrote:
> On 9/27/2012 12:48 PM, Captain Paralytic wrote:
>
> > On Sep 27, 7:25 am, Ryan <rbile...@gmail.com> wrote:
>
> >> jw if ph has a build in function to make this easy of am I going to have to roll my own by looping though the array?
>
> > Care to explain what the above is supposed to mean?
>
> jw probably means: Just wondering
> ph probably means PHP
>
> The remainder is reasonably clear (I think).
Those first 2 weren't what I was having particular trouble with. The
rest of it is total nonsense!

Christoph Becker

unread,
Sep 28, 2012, 11:40:17 AM9/28/12
to
Captain Paralytic wrote:
> Those first 2 weren't what I was having particular trouble with. The
> rest of it is total nonsense!

I suppose, what was meant is:

Just wondering, if PHP has a built in function to make this easy, or do
I have to roll my own (by looping through the array)?

--
Christoph M. Becker

0 new messages