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

Efficiency question: Overwrite array value, or ask if it is set?

0 views
Skip to first unread message

Markus Ernst

unread,
Jul 6, 2006, 4:52:50 AM7/6/06
to
Hi

While looping through an array I extract all keys on the fly, as in this
example:

$data = array(
array('name' => 'Helen', 'age' => '40'),
array('name' => 'Mark', 'email' => 'ma...@xyz.com', 'age' => '90'),
);
$keys = array();
foreach ($data as $row) {
foreach ($row as $key => $value) {
// do other things here
$keys[$key] = 1;
}
}
$column_names = array_keys($keys);

Now my question is about the line
$keys[$key] = 1;

This overwrites existing entries and thus creates a set of unique keys.
This could also be done without overwriting:
if (!isset($keys[$key])) $keys[$key] = 1;

So I wonder which is more efficient - overwriting the array entry at
every loop, or checking for it with the if statement.

Thanks for a comment
Markus

Paul Lautman

unread,
Jul 6, 2006, 5:16:12 AM7/6/06
to

ISTR a general rule that said that assignments were more efficienct that
tests.
If this is not the case, then the answer to your question depends on whether
in most cases you will end up doing the assignment, or whether in most cases
the value is already set.
If the former is true, then it is certainly not more efficient, if the
latter then it may be. This is where knowing something about the data is
required.

I think that all makes sense!


ImOk

unread,
Jul 6, 2006, 10:33:01 AM7/6/06
to
I understand what you are doing. I changed it a little which I believe
is a little more intuitive. It may even be faster.

$data = array(
array('name' => 'Helen', 'age' => '40'),

array('name' => 'Mark', 'email' => '...@xyz.com', 'age' => '90'),
);
$column_names=array();


foreach ($data as $row) {
foreach ($row as $key => $value) {
// do other things here

if (!in_array($key,$column_names)) $column_names[]=$key;

Alvaro G. Vicario

unread,
Jul 6, 2006, 3:35:03 PM7/6/06
to
*** Markus Ernst escribió/wrote (Thu, 06 Jul 2006 10:52:50 +0200):
> So I wonder which is more efficient - overwriting the array entry at
> every loop, or checking for it with the if statement.

A quick dirty benchmark with loops and microtime(), using the code you
posted, shows that assigning is slightly faster that testing, running from
command line. The saving ranges from 3% to 6%.

If you're interested in these issues you may like Xdebug and WinCacheGrind:

http://xdebug.org/
http://sourceforge.net/projects/wincachegrind/

--
-+ http://alvaro.es - Álvaro G. Vicario - Burgos, Spain
++ Mi sitio sobre programación web: http://bits.demogracia.com
+- Mi web de humor con rayos UVA: http://www.demogracia.com
--

Markus Ernst

unread,
Jul 7, 2006, 6:13:00 AM7/7/06
to
Markus Ernst schrieb:

Thank you all for your inputs! I finally tested the versions suggested
with my real data.
Version 1: $keys[$key] = $key;
Version 2: if (!isset($keys[$key])) $keys[$key] = $key;
Version 3: if (!in_array($key, $keys)) $keys[] = $key;

Though it was only a few lines, all versions in the same script, the
rankings differed from call to call; maybe I could say that version 1
tends to be fastest when total execution is fast, and version 3 tends to
win when total execution is slower.

Anyway the range was between 0.05 and 0.1 second, which was not really
the reason for my total execution time of 25-35 seconds! (Going on
measuring and optimizing other parts of the code, I reduced it to 3-5
seconds now!)

0 new messages