无法使用字符串键解压数组
Cannot unpack array with string keys
错误信息是:
FATAL ERROR Uncaught Error: Cannot unpack array with string keys
我知道我可以简单地 运行 方法 fetch()
两次并通过 ['q']
和 ['bind']
,但我正在努力掌握使用新的方法...
解压值。我想像这样传递值:
(string) SQL, (Array) Bind Values
但我认为它会尝试从 fetch()
方法解压缩绑定值数组和响应数组。是否可以解压这个数组?
看起来像这样:
array(2) {
["q"] => string(7) "example"
["bind"] => array(1) {
["example"] => string(3) "one"
}
}
这是完整的代码,如果您需要查看它们是如何组合在一起的:
class ModelController {
public static function execute($sql, $vals) {
var_dump($vals);
}
}
class ModelContainer {
private $queries = [];
public function add_model(Model $model, $name) {
$this->queries[$name] = $model;
return $this;
}
public function exec_all() {
foreach($this->queries as $q) {
ModelController::execute(...$q->fetch());
}
}
public function exec($name) {
}
}
class Model {
private $sql;
private $vals = [];
public function set_q($statement) {
$this->sql = $statement;
return $this;
}
public function bind($vals = []) {
$this->vals = $vals;
return $this;
}
public function fetch() {
return ['q' => (string)$this->sql,
'bind' => $this->vals ];
}
}
$m = new ModelContainer();
$m->add_model((new Model)->set_q('example SQL content here')->bind(['example' => 'example value here']), 'one');
$m->exec_all();
问题是 splat operator(数组拆包运算符或 ...
)不适用于关联数组。示例:
$array = [1, 2, 3];
$assoc = ["one" => 1, "two" => 2, "three" => 3];
var_dump(...$array); //Works
var_dump(...$assoc); //Doesn't work
您需要强制对数组进行数字索引才能将其解压缩。您可以使用 array_values:
$values = array_values($q->fetch());
ModelController::execute(...$values);
数组值将确保所有值都有一个连续的数字键。
更新
从 PHP8 开始,将支持命名参数,这将使两种情况都有效。 proposed RFC for named arguments 中记录了一个示例,其中说明以下代码应该从 PHP 8
开始工作
$params = ['start_index' => 0, 'num' => 100, 'value' => 50];
array_fill(...$params);
如果在尝试将关联数组解包到另一个数组时出现此错误,则可以改用 array_merge
:
<?php
$inner = ["b" => "i", "c" => "i"];
$outer = ["a" => "o", "c" => "o"];
var_dump(array_merge($outer, $inner));
var_dump(array_merge($inner, $outer));
会产生
array(3) {
["a"]=>
string(1) "o"
["c"]=>
string(1) "i"
["b"]=>
string(1) "i"
}
array(3) {
["b"]=>
string(1) "i"
["c"]=>
string(1) "o"
["a"]=>
string(1) "o"
}
更新PHP8.1
从 PHP 8.1 开始,解包数组也适用于字符串键数组,因此错误 FATAL ERROR Uncaught Error: Cannot unpack array with string keys 将不会出现不再适用。
示例:
$array1 = ["a" => 1];
$array2 = ["a" => 2];
$array = ["a" => 0, ...$array1, ...$array2];
var_dump($array); // ["a" => 2]
错误信息是:
FATAL ERROR Uncaught Error: Cannot unpack array with string keys
我知道我可以简单地 运行 方法 fetch()
两次并通过 ['q']
和 ['bind']
,但我正在努力掌握使用新的方法...
解压值。我想像这样传递值:
(string) SQL, (Array) Bind Values
但我认为它会尝试从 fetch()
方法解压缩绑定值数组和响应数组。是否可以解压这个数组?
看起来像这样:
array(2) {
["q"] => string(7) "example"
["bind"] => array(1) {
["example"] => string(3) "one"
}
}
这是完整的代码,如果您需要查看它们是如何组合在一起的:
class ModelController {
public static function execute($sql, $vals) {
var_dump($vals);
}
}
class ModelContainer {
private $queries = [];
public function add_model(Model $model, $name) {
$this->queries[$name] = $model;
return $this;
}
public function exec_all() {
foreach($this->queries as $q) {
ModelController::execute(...$q->fetch());
}
}
public function exec($name) {
}
}
class Model {
private $sql;
private $vals = [];
public function set_q($statement) {
$this->sql = $statement;
return $this;
}
public function bind($vals = []) {
$this->vals = $vals;
return $this;
}
public function fetch() {
return ['q' => (string)$this->sql,
'bind' => $this->vals ];
}
}
$m = new ModelContainer();
$m->add_model((new Model)->set_q('example SQL content here')->bind(['example' => 'example value here']), 'one');
$m->exec_all();
问题是 splat operator(数组拆包运算符或 ...
)不适用于关联数组。示例:
$array = [1, 2, 3];
$assoc = ["one" => 1, "two" => 2, "three" => 3];
var_dump(...$array); //Works
var_dump(...$assoc); //Doesn't work
您需要强制对数组进行数字索引才能将其解压缩。您可以使用 array_values:
$values = array_values($q->fetch());
ModelController::execute(...$values);
数组值将确保所有值都有一个连续的数字键。
更新
从 PHP8 开始,将支持命名参数,这将使两种情况都有效。 proposed RFC for named arguments 中记录了一个示例,其中说明以下代码应该从 PHP 8
开始工作$params = ['start_index' => 0, 'num' => 100, 'value' => 50];
array_fill(...$params);
如果在尝试将关联数组解包到另一个数组时出现此错误,则可以改用 array_merge
:
<?php
$inner = ["b" => "i", "c" => "i"];
$outer = ["a" => "o", "c" => "o"];
var_dump(array_merge($outer, $inner));
var_dump(array_merge($inner, $outer));
会产生
array(3) {
["a"]=>
string(1) "o"
["c"]=>
string(1) "i"
["b"]=>
string(1) "i"
}
array(3) {
["b"]=>
string(1) "i"
["c"]=>
string(1) "o"
["a"]=>
string(1) "o"
}
更新PHP8.1
从 PHP 8.1 开始,解包数组也适用于字符串键数组,因此错误 FATAL ERROR Uncaught Error: Cannot unpack array with string keys 将不会出现不再适用。
示例:
$array1 = ["a" => 1];
$array2 = ["a" => 2];
$array = ["a" => 0, ...$array1, ...$array2];
var_dump($array); // ["a" => 2]