Re: array key's: which is correct?

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Paul M Foster wrote:
On Tue, Jun 08, 2010 at 04:44:53PM +0200, Peter Lind wrote:

On 8 June 2010 16:38, Ashley Sheridan <ash@xxxxxxxxxxxxxxxxxxxx> wrote:
On Tue, 2010-06-08 at 10:35 -0400, Paul M Foster wrote:

On Tue, Jun 08, 2010 at 09:38:58AM -0400, Robert Cummings wrote:

Tanel Tammik wrote:
Hi,

which one is correct or "better"?

$array[3] = '';
or
$array['3'] = '';

$i = 7;

$array[$i] = '';
or
$array["$i"] = '';
Sometimes it is good to illustrate the correct answer:

<?php

$array = array
(
    '1'     => '1',
    '2'     => '2',
    'three' => 'three',
    '4.0'   => '4.0',
    5.0     => 5.0,
);

var_dump( array_keys( $array ) );

?>

The answer is surprising (well, not really :) and certainly advocates
against making literal strings of integers or manually converting a
string integer to a real integer or using floating point keys.
Curse you, Rob Cummings! ;-}

I was stunned at the results of this. I assumed that integers cast as
strings would remain strings as indexes. Not so. And then float indexes
cast to ints. Argh!

My advice to the original poster was slightly incorrect. But I would
still encourage you to avoid enclosing variables in double-quotes
unnecessarily. (And integers in single-quotes for that matter.)

Paul

--
Paul M. Foster


The obvious way around this would be to include some sort of character
in the index that can't be cast to an integer, so instead of $array[1.0]
which would equate to $array[1] maybe add an underscore to make it
$array['_1.0']. It's not the prettiest of solutions, but it does mean
that indexes are kept as you intended, and you need only strip out the
first character, although I imagine a lot of string manipulation on a
large array would decrease performance.
Floats in quotes are not cast to int when used as array keys. Just an FYI :)

Umm, yes, you are correct. I pasted Rob's code into a test file, added
some other print_r()s and such, just to look at the whole issue. I'm
*still* examining the results, trying to wrap my wits around why things
are done this way.

If I were to hazard a guess as to the "why" of the current functionality, I would say converting an integer string to a real i nt is optimal with respect to both memory and processing when trying to find values by key. As for floating points... Due to the inability to accurately represent some floating point numbers in binary, one would often not get what one expects even when converting to a string. So maybe integer was chosen since it was more optimal than a string.

Cheers,
Rob.
--
E-Mail Disclaimer: Information contained in this message and any
attached documents is considered confidential and legally protected.
This message is intended solely for the addressee(s). Disclosure,
copying, and distribution are prohibited unless authorized.

--
PHP General Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php



[Index of Archives]     [PHP Home]     [Apache Users]     [PHP on Windows]     [Kernel Newbies]     [PHP Install]     [PHP Classes]     [Pear]     [Postgresql]     [Postgresql PHP]     [PHP on Windows]     [PHP Database Programming]     [PHP SOAP]

  Powered by Linux