By using this site, you agree to our updated Privacy Policy and our Terms of Use. Manage your Cookies Settings.
435,543 Members | 2,169 Online
Bytes IT Community
+ Ask a Question
Need help? Post your question and get tips & solutions from a community of 435,543 IT Pros & Developers. It's quick & easy.

in_array() to find an object inside an array

P: n/a
[PHP]
if (is_array($_POST["assoc_$key"])) {
foreach ($this->getAssocSectionsObjArray($key, $dbAP) as
$obj) {
print_r($obj); print_r(" in array? ");
print_r(in_array($obj, $result)); print_r("<P>");
if (!in_array($obj, $result)) array_push($result, $obj);
}
}
[/PHP]

Here is the output of the result of this script:

stdClass Object ( [id] => 2 [placement_name] => Placement #1 ) in
array?
Warning: in_array(): Wrong datatype for first argument in
/image_catalog/include/classes.inc.php on line 99
Warning: in_array(): Wrong datatype for first argument in
/www/html/mu-spin/image_catalog/include/classes.inc.php on line 100
stdClass Object ( [id] => 4 [placement_name] => Placement #10 ) in
array?
Warning: in_array(): Wrong datatype for first argument in
/image_catalog/include/classes.inc.php on line 99
Warning: in_array(): Wrong datatype for first argument in
/www/html/mu-spin/image_catalog/include/classes.inc.php on line 100
stdClass Object ( [id] => 6 [placement_name] =>
http://blah.com ) in array?
Warning: in_array(): Wrong datatype for first argument in
/image_catalog/include/classes.inc.php on line 99
Warning: in_array(): Wrong datatype for first argument in
/image_catalog/include/classes.inc.php on line 100
What I have to do is compare an array of objects, $result, with
another array of objects, $this->getAssocSectionsObjArray($key,
$dbAP). Both arrays will be identical in structure and object
formatting, but not in object data content. What I need to do is to
find out if that one array has the very same object as the other, then
don't add it to $result, otherwise, add to $result.

The object formatting is as follows:

obj: stdClass Object ( [id] => 2 [placement_name] => Placement
#1 )
And $result can look like this:

result: Array ( [0] => stdClass Object ( [id] => 6 [placement_name] =>
Placement #27 ) [1] => stdClass Object ( [id] => 2 [placement_name] =>
Placement #1 ) )
I don't wish to loop through both arrays, that would be a performance
nightmare to do that. Is there a version of in_array in existence for
comparing objects?

Thanx
Phil

PS: I went to this manual example at
http://us3.php.net/manual/en/functio...rray.php#40079
but that involves recursive handling and object rebuilding - this,
were I to figure out what the living blue it is, would have to be put
inside another loop.. OUCH!
Jul 17 '05 #1
Share this Question
Share on Google+
3 Replies


P: n/a
Hi Phil,

why give each object a unique oid? Then you can do:

$objectsByOid[SanObject->getOid()] =& $anObject;

Then you can see if an object is in $objectsByOid by:

isSet( $objectsByOid[SsomeObject->getOid()] )

BTW, i think in_array() does do a sequential search, so it wont be so
much faster then those while loops. The above uses associative keys,
which is probably implemented with hashing. Proper hashing is about half
as fast as indexed lookup, but it does not substantially slow down for
large arrays.

So the following should perform linear with count($someObjects), not
with count($someObjects) * count($objectsByOid):

$objectsInBoth = array();
while ( list($key) = each($someObjects) )
if (isSet( $objectsByOid[SsomeObjects[$key]->getOid()] )
$objectsInBoth[] =& SsomeObjects[$key];

Greetings,

Henk Verhoeven,
www.phpPeanuts.org.

BTW, to compare two arrays at once, you may use
$someArray == $anotherArray, unless they contain objects or arrays with
circular references, in that case you neet to resort to:
serialize($someArray) == serialize($anotherArray)

Phil Powell wrote:
[PHP]
if (is_array($_POST["assoc_$key"])) {
foreach ($this->getAssocSectionsObjArray($key, $dbAP) as
$obj) {
print_r($obj); print_r(" in array? ");
print_r(in_array($obj, $result)); print_r("<P>");
if (!in_array($obj, $result)) array_push($result, $obj);
}
}
[/PHP]

Here is the output of the result of this script:

> stdClass Object ( [id] => 2 [placement_name] => Placement #1 ) in
array?
Warning: in_array(): Wrong datatype for first argument in
/image_catalog/include/classes.inc.php on line 99
Warning: in_array(): Wrong datatype for first argument in
/www/html/mu-spin/image_catalog/include/classes.inc.php on line 100
stdClass Object ( [id] => 4 [placement_name] => Placement #10 ) in
array?
Warning: in_array(): Wrong datatype for first argument in
/image_catalog/include/classes.inc.php on line 99
Warning: in_array(): Wrong datatype for first argument in
/www/html/mu-spin/image_catalog/include/classes.inc.php on line 100
stdClass Object ( [id] => 6 [placement_name] =>
http://blah.com ) in array?
Warning: in_array(): Wrong datatype for first argument in
/image_catalog/include/classes.inc.php on line 99
Warning: in_array(): Wrong datatype for first argument in
/image_catalog/include/classes.inc.php on line 100

What I have to do is compare an array of objects, $result, with
another array of objects, $this->getAssocSectionsObjArray($key,
$dbAP). Both arrays will be identical in structure and object
formatting, but not in object data content. What I need to do is to
find out if that one array has the very same object as the other, then
don't add it to $result, otherwise, add to $result.

The object formatting is as follows:

obj: stdClass Object ( [id] => 2 [placement_name] => Placement
#1 )

And $result can look like this:

> result: Array ( [0] => stdClass Object ( [id] => 6 [placement_name] =>
Placement #27 ) [1] => stdClass Object ( [id] => 2 [placement_name] =>
Placement #1 ) )
I don't wish to loop through both arrays, that would be a performance
nightmare to do that. Is there a version of in_array in existence for
comparing objects?

Thanx
Phil

PS: I went to this manual example at
http://us3.php.net/manual/en/functio...rray.php#40079
but that involves recursive handling and object rebuilding - this,
were I to figure out what the living blue it is, would have to be put
inside another loop.. OUCH!


Jul 17 '05 #2

P: n/a

Henk Verhoeven wrote:
Hi Phil,

why give each object a unique oid? Then you can do:

$objectsByOid[SanObject->getOid()] =& $anObject;

Then you can see if an object is in $objectsByOid by:

isSet( $objectsByOid[SsomeObject->getOid()] )

BTW, i think in_array() does do a sequential search, so it wont be so much faster then those while loops. The above uses associative keys,
which is probably implemented with hashing. Proper hashing is about half as fast as indexed lookup, but it does not substantially slow down for large arrays.

So the following should perform linear with count($someObjects), not
with count($someObjects) * count($objectsByOid):

$objectsInBoth = array();
while ( list($key) = each($someObjects) )
if (isSet( $objectsByOid[SsomeObjects[$key]->getOid()] )
$objectsInBoth[] =& SsomeObjects[$key];

Greetings,

Henk Verhoeven,
www.phpPeanuts.org.

BTW, to compare two arrays at once, you may use
$someArray == $anotherArray, unless they contain objects or arrays with circular references, in that case you neet to resort to:
serialize($someArray) == serialize($anotherArray)

Phil Powell wrote:
[PHP]
if (is_array($_POST["assoc_$key"])) {
foreach ($this->getAssocSectionsObjArray($key, $dbAP) as $obj) {
print_r($obj); print_r(" in array? ");
print_r(in_array($obj, $result)); print_r("<P>");
if (!in_array($obj, $result)) array_push($result, $obj); }
}
[/PHP]

Here is the output of the result of this script:

> > stdClass Object ( [id] => 2 [placement_name] => Placement #1 ) in
array?
Warning: in_array(): Wrong datatype for first argument in
/image_catalog/include/classes.inc.php on line 99
Warning: in_array(): Wrong datatype for first argument in
/www/html/mu-spin/image_catalog/include/classes.inc.php on line 100
stdClass Object ( [id] => 4 [placement_name] => Placement #10 ) in
array?
Warning: in_array(): Wrong datatype for first argument in
/image_catalog/include/classes.inc.php on line 99
Warning: in_array(): Wrong datatype for first argument in
/www/html/mu-spin/image_catalog/include/classes.inc.php on line 100
stdClass Object ( [id] => 6 [placement_name] =>
http://blah.com ) in array?
Warning: in_array(): Wrong datatype for first argument in
/image_catalog/include/classes.inc.php on line 99
Warning: in_array(): Wrong datatype for first argument in
/image_catalog/include/classes.inc.php on line 100

What I have to do is compare an array of objects, $result, with
another array of objects, $this->getAssocSectionsObjArray($key,
$dbAP). Both arrays will be identical in structure and object
formatting, but not in object data content. What I need to do is to find out if that one array has the very same object as the other, then don't add it to $result, otherwise, add to $result.

The object formatting is as follows:

obj: stdClass Object ( [id] => 2 [placement_name] => Placement #1 )

And $result can look like this:

> > result: Array ( [0] => stdClass Object ( [id] => 6 [placement_name] => Placement #27 ) [1] => stdClass Object ( [id] => 2 [placement_name] => Placement #1 ) )
I don't wish to loop through both arrays, that would be a performance nightmare to do that. Is there a version of in_array in existence for comparing objects?

Thanx
Phil

PS: I went to this manual example at
http://us3.php.net/manual/en/functio...rray.php#40079
but that involves recursive handling and object rebuilding - this,
were I to figure out what the living blue it is, would have to be put inside another loop.. OUCH!


Jul 17 '05 #3

P: n/a
Thanx but I'm sorry, I can't follow your reply, it honestly doesn't
make sense to me.

Can you explain it a bit more simply to me?

Thanx
Phil

PS: Never mind, I got it!

[PHP]
/**
* Resultset version of "in_array" function to display boolean results
of finding a resultset-configured object in the resultset
*
* @access private
* @param int $thisID
* @param object $result
* @return boolean
* @see http://us2.php.net/manual/en/function.in-array.php
*/
function in_result($thisID, $result) { // BOOLEAN METHOD
global $section;
$id = ($this->id) ? $this->id : $_REQUEST['id'];
$associatedSection = $this->getAssociatedSection();
$obj->base_section_name = "$section";
$obj->base_section_value = $id;
$obj->associated_section_name = "$associatedSection";
$obj->associated_section_value = $thisID;
$tempResult = $result;
array_walk($tempResult, create_function('$a', 'return
serialize($a);'));
return in_array(serialize($obj), $tempResult);
}
[/PHP]

Thanx
Phil

Jul 17 '05 #4

This discussion thread is closed

Replies have been disabled for this discussion.