加入收藏 | 设为首页 | 会员中心 | 我要投稿 安卓应用网 (https://www.0791zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > PHP > 正文

php – 使用DOT Notations键数组从多维数组中获取选定列

发布时间:2020-05-25 08:46:45 所属栏目:PHP 来源:互联网
导读:我有以下数组 $users = Array( [0] = Array ( [id] = 16 [name] = Dr. Arti Luthra [email] = artiluthra@dsingh.com [gender] = female

我有以下数组

$users = Array
(
    [0] => Array
        (
            [id] => 16
            [name] => Dr. Arti Luthra
            [email] => artiluthra@dsingh.com
            [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] => sudhirseth@gmail.com
            [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,Delhi Greater Kailash,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,Delhi Lajpat Nagar,Delhi
                            [timings] => Array
                                (
                                    [0] => Array
                                        (
                                            [start] => 09:00 AM
                                            [end] => 11:00 AM
                                        )

                                )

                        )

                )

        )

)

我想使用点符号来获取所选键

getKeys($用户,阵列( ‘名称’,‘电子邮件’,‘addresses.address’,‘addresses.clinic_name’,‘addresses.timings.start’))

使用上面的getKeys()方法,输出应该是:

Array
(
    [0] => Array
        (
            [name] => Dr. Arti Luthra
            [email] => artiluthra@dsingh.com
            [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] => sudhirseth@gmail.com
            [addresses] => Array
                (
                    [0] => Array
                        (
                            [clinic_name] => Dr. Sudhir Seth's Orthopoint
                            [address] => D-595,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,Delhi
                            [timings] => Array
                                (
                                    [0] => Array
                                        (
                                            [start] => 09:00 AM
                                        )

                                )

                        )

                )

        )

)

似乎这个问题非常接近xPath for xml结构.

还有什么有趣的json为json例如:

PHP中的JsonPath – https://github.com/Skyscanner/JsonPath-PHP

Myqsl中的JsonPath – https://dev.mysql.com/doc/refman/5.7/en/json-path-syntax.html

但是,不幸的是,对于php阵列,这项技术还没有实现.

编写自己的库(phpPath)是个好点!

特别针对你的一个不同的案例:

/**
 * 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;
}

使用示例:

var_dump(
    getKeys($users,array(
        'name','email','addresses.address','addresses.clinic_name','addresses.timings.start'
    ))
);

(编辑:安卓应用网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读