在多维数组中搜索值并保持键关联

时间:2014-08-29 09:49:13

标签: php arrays multidimensional-array

我从xml的webservice转换了这个数组。我在这个数组中有500个项目。 我想搜索任何值并返回所有找到的具有键关联的数组项(类似于数据库选择查询)。因此,如果我搜索'dummy',那么它应该返回此数组的第一项。

Array
(
    [12.12.2014] => Array
        (
            [7] => Array
                (
                    [id] => 1672
                    [date] => 12.12.2014
                    [description] => rummy dummy data
                    [room] => delux
                    [Type] => garden
                    [from] => 17:00
                    [to] => 17:45
                    [assets] => Array
                        (

                [asset] => Array
                                (
                                    [0] => Array
                                        (
                                            [number] => 5275
                                            [detail] => primary one
                                        )

                    [1] => Array
                                        (
                                            [number] => 19
                                            [detail] => secondary one
                                        )

                                )

                        )

                    [references] => Array
                        (
                            [reference] => Array
                                (
                                    [personnumber] => 479470
                                    [type] => worker
                                    [name] => David
                                    [department] => Sales
                                    [cv] => Array
                                        (
                    [pdetails] => follow later  
                                        )

                                    [profile] => True
                                )

                        )

                )

        )

       [13.12.2014] => Array
        (
            [17] => Array
                (
                    [id] => 1672
                    [date] => 13.12.2014
                    [description] => brown fox jump
                    [room] => star
                    [Type] => city
                    [from] => 17:00
                    [to] => 17:45
                    [assets] => Array
                        (
                            [asset] => Array
                                (
                                   [number] => 5275
                                   [detail] => prime two
                                )

                        )

                    [references] => Array
                        (
                            [reference] => Array
                                (
                                    [personnumber] => 479470
                                    [type] => manager
                                    [name] => Albert
                                    [department] => Purchase
                                    [cv] => Array
                                        (
                    [pdetails] => follow later  
                                        )

                                    [profile] => True
                                )

                        )

                )

        )

)

我尝试stripos在数组值和基于in_array的函数中搜索字符串,但是它提供的结果不正确或者没有维护密钥关联。

我无法找到维护key->值的方法。

function search($array, $key, $value) 
{ 
    $results = array(); 

    if (is_array($array)) 
    { 
        if (isset($array[$key]) && $array[$key] == $value) 
            $results[] = $array; 

        foreach ($array as $subarray) 
            $results = array_merge($results, search($subarray, $key, $value)); 
    } 

    return $results; 
} 

这可能是你见过的最糟糕的功能但是这样做了。如果有人可以使它递归(数组可能会更深)。

function search_in_multi_array($srchvalue, $array)
    {
        $foundkey = '';
        if (is_array($array) && count($array) > 0)
            {
            foreach($array as $pkey => $pvalue)
                {
                foreach($pvalue as $ckey => $cvalue)
                    {
                    if (is_array($cvalue) && count($cvalue) > 0)
                        {
                        if(in_array($srchvalue,$cvalue))
                            {
                            $foundkey[$pkey][$ckey] = $cvalue;
                            }
                            foreach($cvalue as $dkey => $dvalue)
                                {
                                if(!is_array($dvalue))
                                    {
                                    $pos = stripos($dvalue, $srchvalue);
                                    if ($pos !== false)
                                        {
                                        $foundkey[$pkey][$ckey] = $cvalue; 
                                    }
                                }
                            }  
                        }
                    }
                }
            }
        return $foundkey;
    }

函数调用 - $ needle ='fox'; search_in_multi_array($ needle,$ my_array); 这是输出

Array
(
    [13.12.2014] => Array
        (
            [17] => Array
                (
                    [id] => 1672
                    [date] => 13.12.2014
                    [description] => brown fox jump
                    [room] => star
                    [Type1] => city
                    [from] => 17:00
                    [to] => 17:45
                    [assets] => Array
                        (
                            [asset] => Array
                                (
                                    [number] => 5275
                                    [detail] => prime two
                                )

                        )

                    [references] => Array
                        (
                            [reference] => Array
                                (
                                    [personnumber] => 479470
                                    [Type1] => manager
                                    [name] => Albert
                                    [department] => Purchase
                                    [cv] => Array
                                        (
                                            [pdetails] => follow later
                                        )

                                    [profile] => 1
                                )

                        )

                )

        )

)

3 个答案:

答案 0 :(得分:0)

您可能需要查看XPath来对" raw"运行查询。 XML,例如,请参阅DOMXPath

/myRootTag/someDayTag[.//text()[contains(.,'MY_SEARCH_VALUE')]]之类的东西可以做到这一点,选择并返回someDayTag下任何子节点中有myRootTag文本的MY_SEARCH_VALUE个XML元素。

答案 1 :(得分:0)

您可以使用array_search()函数查看数组值。但是array_search只能在一维数组中查找。

由于你有一个多维数组,你可以编写自定义递归函数来在数组中递归搜索

function recursive_array_search($needle,$haystack) {
foreach($haystack as $key=>$value) {
    $current_key=$key;
    if($needle===$value OR (is_array($value) && recursive_array_search($needle,$value) !== false)) {
        return $current_key;
    }
}
return false;
}

但请注意,使用array_search()是一种更简单的方法,但不是优化的功能。这意味着如果你更关心你的内存利用率,那么我还会另外建议。

  • 创建一个新的数组,说'字典'并存储它们 $dictonary[<key-searched>] = array('12.12.2014', '13.12.2014')
  • 所以你处理它们一次,然后缓存它们
  • 因此,下次当您想再次搜索相同的密钥时,可以先检查密钥是否存在于字典中。如果存在从那里返回,则使用array_search并将结果缓存在字典中

按键值搜索总是比在多维数组中搜索更容易。

答案 2 :(得分:0)

我做了一个简单的例程,它会提取您正在寻找的数组中的值:

function search_keys($needle,$haystack)
{
  foreach($haystack as $key => $value)
  {
    if (is_array($value)) $output[$key] = search_keys($needle,$value);
    else if (strpos($value,$needle) !== FALSE) $output[$key] = $value;
  }
  return isset($output) ? $output : NULL; // prevent warning
}

echo '<pre>';
print_r(search_keys('garden',$data));
echo '</pre>';

这将回归花园&#39;为:

Array
(
    [12.12.2014] => Array
        (
            [7] => Array
                (
                    [Type] => garden
                )

        )

)

您可以根据需要进一步处理此功能的输出,或更改功能。