Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Get Selected columns from multidimensional array using DOT Notations keys array

Tags:

arrays

php

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
                                        )

                                )

                        )

                )

        )

)

like image 600
user3909162 Avatar asked Oct 19 '22 04:10

user3909162


1 Answers

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'
    ))
);
like image 57
iMeller Avatar answered Oct 22 '22 00:10

iMeller