I have following array
$users = Array
(
[0] => Array
(
[id] => 16
[name] => Dr. Arti Luthra
[email] => [email protected]
[gender] => female
[mobile] => 123456789
[status] => 0
[addresses] => Array
(
[0] => Array
(
[id] => 16
[clinic_name] => Luthra Medical Center
[address] => A-65/2, Meera Bhagh
[contact_no] => 2342345234
[formatted_address] => A-65/2, Meera Bhagh Rohini, West Delhi, Delhi
[timings] => Array
(
[0] => Array
(
[start] => 09:00 AM
[end] => 02:00 PM
)
[1] => Array
(
[start] => 05:00 PM
[end] => 08:00 PM
)
)
)
[1] => Array
(
[id] => 17
[clinic_name] => Luthra Medical Center
[address] => A-65/2, Chanakyapuri
[contact_no] => 123456789
[formatted_address] => A-65/2, Chanakyapuri Chanakyapuri, South Delhi, Delhi
[timings] => Array
(
[0] => Array
(
[start] => 09:00 AM
[end] => 02:00 PM
)
)
)
)
)
[1] => Array
(
[id] => 39
[name] => Sudhir Seth
[email] => [email protected]
[gender] => male
[mobile] => 65565656565
[status] => 0
[addresses] => Array
(
[0] => Array
(
[id] => 54
[clinic_name] => Dr. Sudhir Seth's Orthopoint
[address] => D-595, Chittranjan Park, Landmark: Besides Deshbandhu College, Delhi
[contact_no] =>
[formatted_address] => D-595, Chittranjan Park, Landmark: Besides Deshbandhu College, Delhi Greater Kailash, South Delhi, Delhi
[timings] => Array
(
[0] => Array
(
[start] => 10:30 AM
[end] => 01:00 PM
)
[1] => Array
(
[start] => 06:00 PM
[end] => 09:00 PM
)
)
)
[1] => Array
(
[id] => 55
[clinic_name] => Fortis C-Doc
[address] => B-16, Chirag Enclave, Nehru Place. Landmark: Opp. to Nehru Place, Delhi
[contact_no] =>
[formatted_address] => B-16, Chirag Enclave, Nehru Place. Landmark: Opp. to Nehru Place, Delhi Lajpat Nagar, South Delhi, Delhi
[timings] => Array
(
[0] => Array
(
[start] => 09:00 AM
[end] => 11:00 AM
)
)
)
)
)
)
I want to get selected keys using dot notation like
getKeys($users,array('name','email','addresses.address','addresses.clinic_name','addresses.timings.start'))
Using above getKeys() method the output should be:
Array
(
[0] => Array
(
[name] => Dr. Arti Luthra
[email] => [email protected]
[addresses] => Array
(
[0] => Array
(
[clinic_name] => Luthra Medical Center
[address] => A-65/2, Meera Bhagh
[timings] => Array
(
[0] => Array
(
[start] => 09:00 AM
)
[1] => Array
(
[start] => 05:00 PM
)
)
)
[1] => Array
(
[clinic_name] => Luthra Medical Center
[address] => A-65/2, Chanakyapuri
[timings] => Array
(
[0] => Array
(
[start] => 09:00 AM
)
)
)
)
)
[1] => Array
(
[name] => Sudhir Seth
[email] => [email protected]
[addresses] => Array
(
[0] => Array
(
[clinic_name] => Dr. Sudhir Seth's Orthopoint
[address] => D-595, Chittranjan Park, Landmark: Besides Deshbandhu College, Delhi
[timings] => Array
(
[0] => Array
(
[start] => 10:30 AM
)
[1] => Array
(
[start] => 06:00 PM
)
)
)
[1] => Array
(
[clinic_name] => Fortis C-Doc
[address] => B-16, Chirag Enclave, Nehru Place. Landmark: Opp. to Nehru Place, Delhi
[timings] => Array
(
[0] => Array
(
[start] => 09:00 AM
)
)
)
)
)
)
Seems that question very approximate to xPath for xml structures.
Also what interesting that there is jsonPath for json for example:
JsonPath in PHP - https://github.com/Skyscanner/JsonPath-PHP
JsonPath in Myqsl - https://dev.mysql.com/doc/refman/5.7/en/json-path-syntax.html
But, unfortunately, for php array this technology have not implemented yet.
It is good point for writing your own library (phpPath)!
Regarding specifically your a little different case:
/**
* Search values by phpPath
*
* @param array $aData
* @param string|array $phpPath
* @param array &$aReturn
* @return array
*/
function getKeys($aData, $phpPath = [], &$aReturn = []) {
//Support arrays of $phpPath
if (is_array($phpPath)) {
foreach ($phpPath as $path) {
getKeys($aData, $path, $aReturn);
}
return $aReturn;
}
//Get next sought-for key
$aParts = explode('.', $phpPath);
$sNeedle = array_shift($aParts);
$sRemain = implode('.', $aParts);
foreach ($aData as $k => $v) {
//skip numeric keys
//@todo need to thinking about
//needs to add * (wildcard) into phpPath for that purpose
if (is_numeric($k) && $phpPath) {
getKeys($v, $phpPath, $aReturn[$k]);
continue;
}
//Is it key that we want
if ($k !== $sNeedle) {
continue;
}
//Checking needs deeper search
if (is_array($v) && $sRemain) {
getKeys($v, $sRemain, $aReturn[$k]);
continue;
}
//Need to save fully-qualified found value
$aReturn[$k] = $v;
break;
}
return $aReturn;
}
Example of using:
var_dump(
getKeys($users, array(
'name', 'email', 'addresses.address',
'addresses.clinic_name', 'addresses.timings.start'
))
);
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With