<?
$map = [];
$cur = null;
function write ($s) {
global $cur;
$cur[] = $s;
}
function set_cursor ($key) {
global $map, $cur;
$cur = [];
$map [$key] = &$cur;
}
set_cursor ("key_a");
write ("Hello");
write ("World");
set_cursor ("key_b");
write ("Foobar");
var_dump ($map);
?>
來自我熟悉的語言(Javascript、C#、C),我希望$map包含
{
"key_a": ['Hello', 'World'],
"key_b": ['Foobar']
}
相反,它包含
{
"key_a": ['Foobar'],
"key_b": ['Foobar']
}
這似乎不直觀。我需要如何修改代碼才能回傳預期的結果?
根據評論中的要求,這里是 Javascript 中產生所需和預期結果的等效代碼:
var map = {};
var cur = null;
function set_cursor (key) {
cur = [];
map [key] = cur;
}
function write (s) {
cur.push (s);
}
set_cursor ("key_a");
write ("Hello");
write ("World");
set_cursor ("key_b");
write ("Foobar");
console.log(map);
uj5u.com熱心網友回復:
好的,與此同時,我自己也弄清楚了。在典型的 PHP 方式中,您必須使用一些無意義的神秘構造來使其作業。特別是,您必須使用$GLOBALS而不是global讓它產生與任何其他語言產生的相同結果。
這是代碼:
<?
$map = [];
$cur = null;
function write ($s) {
global $cur;
$cur[] = $s;
}
function set_cursor ($key) {
global $map;
if (array_key_exists ($key, $map) == false)
$map[ $key] = [];
$GLOBALS["cur"] = &$map[ $key ];
}
set_cursor ("key_a");
write ("Hello");
write ("World");
set_cursor ("key_b");
write ("Foobar");
set_cursor ("key_a");
write ("Hello");
write ("Again");
set_cursor ("key_b");
write ("Bazqux");
var_dump ($map);
?>
uj5u.com熱心網友回復:
你可以使用一個類來實作這一點。
class Map
{
private $map = [];
private $cur = null;
public function write(string $s): self
{
$this->map[$this->cur][] = $s;
return $this;
}
public function set_cursor(string $key): self
{
$this->cur = $key;
return $this;
}
public function getMap(): array
{
return $this->map;
}
}
用法:
$map = new Map();
$map->set_cursor("key_a");
$map->write("Hello");
$map->write("World");
$map->set_cursor("key_b");
$map->write("Foobar");
// fluent style
$map->set_cursor("key_a")
->write("Hello")
->write ("Again");
$map->set_cursor("key_b")->write("Bazqux");
// display
var_dump($map->getMap());
輸出
array(2) {
["key_a"]=>
array(4) {
[0]=>
string(5) "Hello"
[1]=>
string(5) "World"
[2]=>
string(5) "Hello"
[3]=>
string(5) "Again"
}
["key_b"]=>
array(2) {
[0]=>
string(6) "Foobar"
[1]=>
string(6) "Bazqux"
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/407237.html
標籤:
上一篇:無法使用Array_unique
下一篇:在php中按位獲取陣列的所有元素
