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
)
)
)
)
)