I have this array converted from xml of webservice. I have 500 items in this array. I want to search any value and return all found array items with key association ( similar to database select query ). So if I search 'dummy' then it should return first item of this array.
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 ) ) ) ) )
I tried stripos to search string in array value and in_array based functions but either it gives incorrect result or key association is not maintained.
I am unable to find a way to maintain key->value.
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; }
This may be worst function you have ever seen but this do the job. If some one can make it recursive ( array may be further deeper ).
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; }
Function call - $needle = 'fox'; search_in_multi_array($needle, $my_array); This is the output
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 ) ) ) ) )