0

I have the following code:

function searchObject($obj, $field, $value) {
    foreach ($obj as $item){ # gets to products
        foreach ($item as $child) { #gets to products, products is an array of products
            foreach ($child as $grandchild){ #gets to products array
                if (isset($grandchild->$field) && $grandchild->$field == $value) {
                    return $grandchild;
                }
            }
        }
    }
    return "Not Found";
}

This is how it's called:

$freetrialobj = searchObject($arr, "pid", 15);

But that doesn't work, reporting an 'invalid argument'. Here is the print_r of the object of arrays:

Array: stdClass Object
(
[result] => success
[clientid] => 706
[serviceid] => 
[pid] => 
[domain] => 
[totalresults] => 1
[startnumber] => 0
[numreturned] => 1
[products] => stdClass Object
    (
        [product] => Array
            (
                [0] => stdClass Object
                    (
                        [id] => 1014
                        [clientid] => 706
                        [orderid] => 902
                        [pid] => 15
                        [regdate] => 2013-09-03
                        [name] => 
                        [groupname] => 
                        [domain] => 
                        [dedicatedip] => 
                        [serverid] => 0
                        [servername] => 
                        [serverip] => 
                        [serverhostname] => 
                        [firstpaymentamount] => 0.00
                        [recurringamount] => 0.00
                        [paymentmethod] => authorize
                        [paymentmethodname] => Authorize.net
                        [billingcycle] => Free Account
                        [nextduedate] => 0000-00-00
                        [status] => Pending
                        [username] => 
                        [password] => 
                        [subscriptionid] => 
                        [promoid] => 0
                        [overideautosuspend] => 
                        [overidesuspenduntil] => 0000-00-00
                        [ns1] => 
                        [ns2] => 
                        [assignedips] => 
                        [notes] => 
                        [diskusage] => 0
                        [disklimit] => 0
                        [bwusage] => 0
                        [bwlimit] => 0
                        [lastupdate] => 0000-00-00 00:00:00
                        [customfields] => stdClass Object

What is the best way to check a nested object like this for a value?

4

1 回答 1

1

可能有一个 php 函数可以做到这一点,但不要像你的函数尝试那样强制它,让我们应用一些递归思维:

function searchObject($obj, $field, $value) {
  if (is_array($obj)) { //Is this object even array?
    if( array_key_exists($field, $obj) ) { //Check to see if the object exists
      return $obj->$field;  //If so, return it
    } else {
      foreach ($obj as $key => $val) {//Search all sub-objects
        $result = searchObject($val, $field, $value);//Make a recursive call
        if ($result !== false) {//If not false, we found it!
          return $result; //return the result
        }
      }
      return false;//Otherwise we didn't find it, return false
    }
  } else {
    return false;//This isn't an array, so it can't possibly have the field.
  }
}

这应该能够(进行深度优先)为您的领域搜索任何深度的对象,并返回它或者false如果它不存在。请注意,它将返回找到的第一个此类字段;如果有多个匹配字段,您将错过第一个以外的任何内容。

于 2013-09-03T21:34:05.107 回答