php – 如何编写getter / setter以通过键名来访问多级数组?

前端之家收集整理的这篇文章主要介绍了php – 如何编写getter / setter以通过键名来访问多级数组?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我必须在 PHP中实现一个setter,它允许我指定数组(目标)的键或子键,将该名称作为点分隔键值传递.

给出以下代码

$arr = array('a' => 1,'b' => array(
                 'y' => 2,'x' => array('z' => 5,'w' => 'abc')
             ),'c' => null);

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

从$key的值我想达到$arr [‘b’] [‘x’] [‘z’]的值5.

现在….
给出$key的变量值和不同的$arr值(具有不同的深度).

如何设置$key指向的元素的值?

对于getter 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;
}

写一个setter是比较困难的,因为我成功地达到了正确的元素(从$key),但是我不能在原来的数组中设置这个值,我不知道如何一次性地指定这个键.

我应该使用某种回溯吗?还是我可以避免呢?

假设$path已经是通过explode()(或添加函数)的数组,然后使用引用.您需要添加一些错误检查,以防无效$path等…
$key = 'b.x.z';
$path = explode('.',$key);

消气

function get($path,$array) {
    $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) {
    $temp = &$array;

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

set($path,$arr);
//or
set($path,$arr,'some value');

*原来的答案有一些有限的功能,我会离开,以防万一他们对某人有用:

二传手

确保定义$array将被引用& $array传递:

function set(&$array,$path,$value) {
    $temp = &$array;

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

set($arr,'some value');

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

function set($array,$value) {
    $temp = &$array;

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

    return $array;
}

$arr = set($arr,'some value');

创造者

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

function create($path,$value=null) {

    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’] ;:

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

    return $result;
}

猜你在找的PHP相关文章