函数in_array() - 在多维对象数组中查找值

时间:2013-07-04 07:07:59

标签: php arrays search

我面临一些问题,我无法解决自己。 我想要实现的是一种搜索过滤器。我有一个数组,可以在1行到+100行之间变化。 该数组的构建如下:

Array
(
    [0] => Array
        (
            [0] => PK customer
            [1] => Call number
            [2] => Subject of the call
            [3] => Date created
            [4] => Date changed
        )

      )

这是我的一个数组的真实版本:

stdClass Object ( [ReadOpenCallsResult] => stdClass Object ( 
   [ArrayOfstring] => Array
   ( 
      [0] => stdClass Object ( 
        [string] => Array 
        (
           [0] => 180355
           [1] => C0000448207
           [2] => TESTDOC 
           [3] => 3-7-2013 14:20:14 
           [4] => 3-7-2013 14:20:14 
             )
       [1] => stdClass Object ( 
         [string] => Array 
         (
            [0] => 180355
            [1] => C0000448209
            [2] => TESTDOC 
            [3] => 2-7-2013 14:20:14 
            [4] => 2-7-2013 14:20:14  
    ) 
 )

我有一个WCF Web服务,它在C#中生成一个函数结果数组,然后将其发送到我的PHP页面。 现在我正在测试in_array函数,它与一个简单的数组完美配合,但我似乎无法使它与多维数组一起工作。 我将我的数组存储到$_SESSION['searchCalls']

我测试过所有类型的数组,但我无法让“真正的”数组工作。 我这样试过:

$key = array_search('180335',$_SESSION['searchCalls']);

就这样

if (in_array('180335',$_SESSION['searchCalls']))
编辑:我看到了一些非常好的例子,但是......当有人找到'C0000448207'然后得到调用的主题和用它创建的日期时,是否有可能得到子数组中的所有值?

这是生成对象数组的函数。

 public List<List<string>> ReadOpenCalls(int relation)
        {

            RidderIQSDK IQSDK = new RidderIQSDK();

                SDKRecordset inboundSet = IQSDK.CreateRecordset("R_ACTIONSCOPE", "PK_R_ACTIONSCOPE, DESCRIPTION, DATECREATED, DATECHANGED, CODE", "FK_RELATION = " + relation, "DATECREATED DESC ");
                var messages = new List<List<string>>();
                List<string> mess = new List<string>();

                if (inboundSet != null && inboundSet.RecordCount > 0)
                {
                    inboundSet.MoveFirst();

                    do
                    {
                        List<string> list = new List<string>();
                        string pkas = inboundSet.Fields["PK_R_ACTIONSCOPE"].Value.ToString();
                        string code = inboundSet.Fields["CODE"].Value.ToString();
                        string descr = inboundSet.Fields["DESCRIPTION"].Value.ToString();
                        string datecreated = inboundSet.Fields["DATECREATED"].Value.ToString();
                        string datechanged = inboundSet.Fields["DATECREATED"].Value.ToString();

                        list.Add(pkas);
                        list.Add(code);
                        list.Add(descr);
                        list.Add(datecreated);
                        list.Add(datechanged);

                        messages.Add(list);

                        inboundSet.MoveNext();

                    }
                    while (!inboundSet.EOF);
                    return messages;
                }
                    mess.Add(null);
                    messages.Add(mess);

                    IQSDK.Logout();
                    return messages;


                }

我自己已经解决了,这是我的解决方案,有点讨厌,但它有效。

$roc = array('relation' => $_SESSION['username']);
$rocresponse = $wcfclient->ReadOpenCalls($roc);
$_SESSION['searchCalls'] = $rocresponse;

    foreach ($rocresponse->ReadOpenCallsResult as $key => $value){
    if (count($value) === 0) {
    }
    if (count($value) === 1) { 
        foreach ($value as $key1 => $value1){
            if (in_array($searchWord,$value1)){
                    echo "Value is in it";
                }
        }
    }
    else{
        foreach($value as $key1 => $value1){
            foreach($value1 as $key2 => $value2){
                if (array_search($searchWord,$value2)){
                    print_r($value2);
                }

            }
        }
    }
}

我总是对更好的解决方案感兴趣,也许这个解决方案也可以帮助其他人。

1 个答案:

答案 0 :(得分:1)

正如Nisarg所指出的,这不是一个数组,而是一个对象。或者您需要更新您的问题以表明您已访问该对象。

如果你尝试这样的事情怎么办

$SearchCalls =  $_SESSION['searchCalls'];
if (in_array('180335',$SearchCalls->ReadOpenCallsResult)){

 //do some work.
}