0

目标是通过 custom_format() 传递特定的数组元素。

示例:如果 $hierarchy = '4:0:2',则 $data[4][0][2] = custom_format($data[4][0][2])。

有谁知道如何在不依赖 eval()的情况下复制以下代码?

当前代码:

$hierarchy = '4:0:2';
$hierarchy = str_replace(':', '][', $hierarchy);
eval("\$data[$hierarchy] = custom_format(\$data[$hierarchy]);");

提前致谢。

4

2 回答 2

2

一个过于冗长但优雅的选项如下:

class MyArray implements ArrayAccess {
    public function offsetExists($offset) {
        if(!is_array($offset))
            $offset = explode(':', $value);
        $key = array_shift($offset);
        if($key !== NULL) {
            if($this->$key InstanceOf MyArray) {
                return(isset($this->$key[$offset]));
            }
        }
    }
    public function offsetGet($offset) {
        if(!is_array($offset))
            $offset = explode(':', $value);
        $key = array_shift($offset);
        if($key !== NULL) {
            if($this->$key InstanceOf MyArray) {
                return($this->$key[$offset]);
            }
        }
    }
    public function offsetSet($offset, $value) {
        if(!is_array($offset))
            $offset = explode(':', $value);
        $key = array_shift($offset);
        if($key !== NULL) {
            if(!($this->$key InstanceOf MyArray)) {
                $this->$key = new MyArray;
            }
            $this->$key[$offset] = $value;
        }
    }
    public function offsetUnset($offset) {
        if(!is_array($offset))
            $offset = explode(':', $value);
        $key = array_shift($offset);
        if($key !== NULL) {
            if($this->$key InstanceOf MyArray) {
                return(unset($this->$key[$offset]));
            }
            if(count($offset) == 0) {
                return(unset($this->$key));
            }
        }
    }
}

这确实意味着MyArray在您需要这种数组行为的任何地方使用,并且可能创建一个静态方法,该方法递归地转换数组并将子数组转换为 MyArray 对象,以便它们一致地响应此行为。

一个具体的例子是需要改变offsetGet方法,检查 $value 是否是 anarray然后使用转换函数将其转换为 aMyArray如果你想访问它的元素。

于 2012-06-27T15:34:46.980 回答
0

像这样的东西怎么样:

<?php
$hierarchy = '4:0:2';
list($a,$b,$c) = explode(':',$hierarchy);
echo $data[$a][$b][$c];
?>
于 2012-06-27T15:00:47.110 回答