为了账号安全,请及时绑定邮箱和手机立即绑定

如何通过键名/路径访问和操作多维数组?

如何通过键名/路径访问和操作多维数组?

PHP
慕盖茨4494581 2019-06-12 17:02:39
如何通过键名/路径访问和操作多维数组?我必须实现一个塞特在PHP中,这允许我指定数组(目标)的键或子键,将名称作为点分隔的键值传递。鉴于以下代码:$arr = array('a' => 1,              'b' => array(                  'y' => 2,                  'x' => array('z' => 5, 'w' => 'abc')              ),              'c' => null);$key = 'b.x.z';$path = explode('.', $key);从…的价值$key我想达到这个价值5的$arr['b']['x']['z'].现在,给定的变量值为$key不同的$arr价值(具有不同的深度)。如何设置$key?为吸气剂 get()我写了这段代码:public static function get($name, $default = null){     $setting_path = explode('.', $name);     $val = $this->settings;     foreach ($setting_path as $key) {         if(array_key_exists($key, $val)) {             $val = $val[$key];         } else {             $val = $default;             break;         }     }     return $val;}写一个塞特是比较困难的,因为我成功地找到了正确的元素(从$key),但我无法在原始数组中设置值,也不知道如何一次性指定键。我应该使用某种回溯吗?或者我能避开它吗?
查看完整描述

3 回答

?
倚天杖

TA贡献1828条经验 获得超3个赞

假设$path已经是一个数组explode(或添加到函数中),则可以使用引用。您需要在无效的情况下添加一些错误检查。$path等。(认为isset):

$key = 'b.x.z';$path = explode('.', $key);

吸气剂

function get($path, $array) {
    //$path = explode('.', $path); //if needed
    $temp =& $array;

    foreach($path as $key) {
        $temp =& $temp[$key];
    }
    return $temp;}$value = get($path, $arr); //returns NULL if the path doesn't exist

策划人/创造者

此组合将在现有数组中设置一个值,或者如果您传递一个尚未定义的数组,则创建该数组。一定要定义$array以参考方式传递&$array:

function set($path, &$array=array(), $value=null) {
    //$path = explode('.', $path); //if needed
    $temp =& $array;

    foreach($path as $key) {
        $temp =& $temp[$key];
    }
    $temp = $value;}set($path, $arr);//orset($path, $arr, 'some value');

Unsetter

这将unset路径中的最后一个键:

function unsetter($path, &$array) {
    //$path = explode('.', $path); //if needed
    $temp =& $array;

    foreach($path as $key) {
        if(!is_array($temp[$key])) {
            unset($temp[$key]);
        } else {
            $temp =& $temp[$key];
        }
    }}unsetter($path, $arr);

*原来的答覆有一些有限的功能,如果对某人有用,我会留下:

塞特

一定要定义$array以参考方式传递&$array:

function set(&$array, $path, $value) {
    //$path = explode('.', $path); //if needed
    $temp =& $array;

    foreach($path as $key) {
        $temp =& $temp[$key];
    }
    $temp = $value;}set($arr, $path, 'some value');

或者如果您想返回更新的数组(因为我很无聊):

function set($array, $path, $value) {
    //$path = explode('.', $path); //if needed
    $temp =& $array;

    foreach($path as $key) {
        $temp =& $temp[$key];
    }
    $temp = $value;

    return $array;}$arr = set($arr, $path, 'some value');

创作者

如果不创建数组并可选择设置值:

function create($path, $value=null) {
    //$path = explode('.', $path); //if needed
    foreach(array_reverse($path) as $key) {
        $value = array($key => $value);
    }
    return $value;}    $arr = create($path);    //or$arr = create($path, 'some value');

寻乐

构造和评估如下$array['b']['x']['z'];给出一串b.x.z:

function get($array, $path) {
    //$path = explode('.', $path); //if needed
    $path = "['" . implode("']['", $path) . "']";
    eval("\$result = \$array{$path};");

    return $result;}


查看完整回答
反对 回复 2019-06-12
?
慕后森

TA贡献1802条经验 获得超5个赞

我不是在纯PHP中为您提供解决方案,而是使用乌佐糖具体而言数组:getNestedValue方法:

$arr = array('a' => 1,
    'b' => array(
        'y' => 2,
        'x' => array('z' => 5, 'w' => 'abc')
    ),
    'c' => null);$key = 'b.x.z';$path = explode('.', $key);print_r(Arrays::getNestedValue($arr, $path));

类似地,如果需要设置嵌套值,则可以使用数组:setNestedValue方法。

$arr = array('a' => 1,
    'b' => array(
        'y' => 2,
        'x' => array('z' => 5, 'w' => 'abc')
    ),
    'c' => null);Arrays::setNestedValue($arr, array('d', 'e', 'f'), 'value');print_r($arr);


查看完整回答
反对 回复 2019-06-12
  • 3 回答
  • 0 关注
  • 422 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信