Php 动态创建';n';带值的深度数组
我正在尝试创建一个类,通过它我应该能够创建任何深度的数组/值。但是我找不到办法。任何建议/提示/帮助都很好 这是密码Php 动态创建';n';带值的深度数组,php,multidimensional-array,Php,Multidimensional Array,我正在尝试创建一个类,通过它我应该能够创建任何深度的数组/值。但是我找不到办法。任何建议/提示/帮助都很好 这是密码 class CreateArray{ public function __construct() { } private $array = []; public function add_value($value){ $this->array[] = $value;
class CreateArray{
public function __construct() {
}
private $array = [];
public function add_value($value){
$this->array[] = $value;
return $this;
}
public function sub_array_start() {
// What to do here?!
return $this;
}
public function sub_array_end() {
// What to do here?!
return $this;
}
public function get() {
return $this->array;
}
}
$d_array = new CreateArray();
$d_array = $d_array
->add_value([1, 2, 3])
->sub_array_start()
->add_value([3, 2, 8])
->add_value([4, 2, 5])
->sub_array_start()
->add_value([4, 2, 5])
->add_value([3, 2, 8])
->sub_array_end()
->add_value([4, 2, 5])
->sub_array_end()
->add_value([1, 2, 3])
->add_value([1, 2, 3])
->sub_array_start()
->add_value([3, 2, 8])
->add_value([4, 2, 5])
->sub_array_start()
->sub_array_start()
->add_value([3, 2, 8])
->add_value([4, 2, 5])
->sub_array_start()
->add_value([3, 2, 8])
->add_value([4, 2, 5])
->sub_array_end()
->sub_array_end()
->add_value([3, 2, 8])
->add_value([4, 2, 5])
->sub_array_end()
->sub_array_end();
->get();
print_r($d_array);
上述代码应创建如下数组-
Array
(
[0] => Array
(
[0] => 1
[1] => 2
[2] => 3
)
[1] => Array
(
[0] => Array
(
[0] => 3
[1] => 2
[2] => 8
)
[1] => Array
(
[0] => 4
[1] => 2
[2] => 5
)
[2] => Array
(
[0] => Array
(
[0] => 4
[1] => 2
[2] => 5
)
[1] => Array
(
[0] => 3
[1] => 2
[2] => 8
)
)
[3] => Array
(
[0] => 4
[1] => 2
[2] => 5
)
)
[2] => Array
(
[0] => 1
[1] => 2
[2] => 3
)
[3] => Array
(
[0] => 1
[1] => 2
[2] => 3
)
[4] => Array
(
[0] => Array
(
[0] => 3
[1] => 2
[2] => 8
)
[1] => Array
(
[0] => 4
[1] => 2
[2] => 5
)
[2] => Array
(
[0] => Array
(
[0] => Array
(
[0] => 3
[1] => 2
[2] => 8
)
[1] => Array
(
[0] => 4
[1] => 2
[2] => 5
)
[2] => Array
(
[0] => Array
(
[0] => 3
[1] => 2
[2] => 8
)
[1] => Array
(
[0] => 4
[1] => 2
[2] => 5
)
)
)
[1] => Array
(
[0] => 3
[1] => 2
[2] => 8
)
[2] => Array
(
[0] => 4
[1] => 2
[2] => 5
)
)
)
)
我认为最简单(但肯定不是有效)的方法是在数组中保留一个简单的当前键列表。然后可以向下遍历并将值/子数组添加到正确的位置(如果不熟悉=&,请查看PHP手册中的参考资料)。代码:
class CreateArray{
private $array = [];
private $keys = [];
public function __construct() {
}
public function add_value($value){
$tmp =& $this->array;
foreach ($this->keys as $key) {
$tmp =& $tmp[$key];
}
$tmp[] = $value;
return $this;
}
public function sub_array_start() {
$tmp =& $this->array;
foreach ($this->keys as $key) {
$tmp =& $tmp[$key];
}
$tmp[] = [];
end($tmp);
$this->keys[] = key($tmp);
reset($tmp);
return $this;
}
public function sub_array_end() {
array_pop($this->keys);
return $this;
}
public function get() {
return $this->array;
}
}
注意:您有一个额外的
代码>在上一个子数组结束()之后,但在其他方面,示例代码是有效的(除非我在快速比较打印内容时忽略了一些内容)。我很无聊,所以我开始了这个。我的大脑现在很累,但这可能会帮助你或其他人朝着正确的方向前进:
class CreateArray{
private $array;
private $previous;
private $current;
public function __construct(){
$this->current =& $this->array;
}
public function add_value($value){
$this->current[] = $value;
return $this;
}
public function sub_array_start() {
$this->previous =& $this->current;
$this->current =& $this->array[];
return $this;
}
public function sub_array_end() {
$this->array =& $this->previous;
$this->current =& $this->array;
return $this;
}
public function get() {
return $this->array;
}
}
我找到了一个办法。虽然我不确定它是否完美。但这是我自己的解决方案-
class CreateArray{
public function __construct() {
}
private $json_string = '';
public function add_value($value){
$value = json_encode($value, true);
$this->json_string .= $value . ',';
return $this;
}
public function sub_array_start() {
$this->json_string .= '[';
return $this;
}
public function sub_array_end() {
$this->json_string = substr($this->json_string, 0, -1);
$this->json_string .= '],';
return $this;
}
public function get() {
$value = '[' . $this->json_string . ']';
$value = str_replace('],]', ']]', $value);
$value = str_replace('},]', '}]', $value);
$value = json_decode($value);
return $value;
}
}
这对类的构造没有帮助,但可能会帮助您解决这个问题:我担心sub\u array\u start
和sub\u array\u end
的概念确实不适合数组的使用方式work@RiggsFolly,一定有办法做到的!我对PHP不太在行,因此无法进一步思考:(这里有一个提示,您必须跟踪当前索引(或至少调用end())和数组指针的嵌套级别。即,您必须保持在数组中的位置状态。这不是诀窍。这在两个或更多连续的子数组上不起作用。)调用。你需要存储和还原所有以前的节点。这就是我对答案半途而废的原因。是的,这还不完整,我不希望有任何更新投票。也许你有使用这种方法的想法?应该能够以某种方式存储对最深层次的引用。我想你的想法是否适合干净的实现。你只需要使用某物。就像以前节点的堆栈。在那之后,剩下的只是一点繁忙的工作。例如,$this->current=&$this->array[];
需要替换为“向current添加一个新的空数组,并使current指向它”。我太懒了,但可能其他人会这样做;或者我很无聊。JSON的有趣用法。很好。