我从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 ) ) ) ) )
答案 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')
按键值搜索总是比在多维数组中搜索更容易。
答案 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
)
)
)
您可以根据需要进一步处理此功能的输出,或更改功能。