|
php.net | support | documentation | report a bug | advanced search | search howto | statistics | random bug | login |
[2002-11-27 11:41 UTC] dparks at verinform dot com
array_search() does not seem to work when the needle is an object.
Sample code:
<?php
class A {
function A () {
}
}
class B {
function B () {
}
}
$g_b = new B ();
$g_array = array ( new A (), 'test', $g_b );
$g_key = array_search(new A (), $g_array);
var_dump($g_key);
$g_key = array_search($g_b, $g_array);
var_dump($g_key);
$g_key = array_search('test', $g_array);
var_dump($g_key);
?>
Output:
<br />
<b>Warning</b>: Wrong datatype for first argument in call to array_search in <b>C:\dparks\Documents\html\tmp.php</b> on line <b>17</b><br />
bool(false)
<br />
<b>Warning</b>: Wrong datatype for first argument in call to array_search in <b>C:\dparks\Documents\html\tmp.php</b> on line <b>20</b><br />
bool(false)
int(1)
Environment:
This is PHP 4.2.3 (binary from Zend or PHP.net) running on Apache 2.0.40 on Win 2K SP3.
Please email me if you would like me to run more tests, or try another build (it may be awhile before I can try another build though -- someone else here had trouble with 4.3rc1 and I am behind schedule).
Thanks,
Daniel
PatchesPull RequestsHistoryAllCommentsChangesGit/SVN commits
|
|||||||||||||||||||||||||||
Copyright © 2001-2025 The PHP GroupAll rights reserved. |
Last updated: Thu Oct 30 08:00:01 2025 UTC |
<?php class A { function A () { } } class B { function B () { } } $g_b = new B (); $g_array = array ( array ( new A () ), array ( 'test' ), array ( $g_b ) ); $g_key = array_search(array ( new A () ), $g_array); var_dump($g_key); $g_key = array_search(array ( $g_b ), $g_array); var_dump($g_key); $g_key = array_search(array ( 'test' ), $g_array); var_dump($g_key); ?> Seems to work as I exect it to: int(0) int(2) int(1) Also, the original example still produces warnings and doesn't find the elements if you change the array_search() calls to in_array().My apologies, I should have give more explanation on this. The following script is nearly an equivalent of array_search(). <?php function _array_search($needle, $haystack, $strict = false) { reset($haystack); while ((list($key, $element) = each($haystack))) { if ($strict) { if ($element === $needle) { return $key; } } else { if ($element == $needle) { return $key; } } } return false; } ?> This function actually accepts objects as a needle, but array_search() doesn't. In this sense, array_search() should go along with objects as you said. However IMO it might be too kind to offer this functionality. <?php class foo { var $value; function foo($val) { $this->value = val; } } $a = new foo(1); $b = new foo(2); $c = $a; $d = &$a; var_dump($a == $b); var_dump($a == $c); var_dump($a == $d); var_dump($c == $d); var_dump($a === $b); var_dump($a === $c); var_dump($a === $d); var_dump($c === $d); var_dump($a == new foo(1)); var_dump($a == new foo(2)); var_dump($b === new foo(2)); ?> What do you think of the result? Some say this could be preferrable, but others couldn't. That's the reason I said the function doesn't need that feature. Isn't this enough?