无法使用字符串键解压缩数组

Jaq*_*arh 14 php arrays

FATAL ERROR未捕获错误:无法使用字符串键解压缩数组

我知道我可以简单地运行该方法fetch()两次并通过['q'],['bind']但我正在尝试使用new ...来解压缩值.我想传递这样的值:

(string) SQL, (Array) Bind Values
Run Code Online (Sandbox Code Playgroud)

但我认为它试图解包绑定值数组以及方法中的响应数组fetch().是否可以解压缩这个数组(看起来像这样:)

array(2) { 
    ["q"]=> string(7) "example" 
    ["bind"]=> array(1) {
        ["example"]=> string(3) "one"
    }
}
Run Code Online (Sandbox Code Playgroud)

这是整个代码,如果你需要看看它们如何组合在一起:

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 here')->bind(['example' => 'example value here']), 'one');
$m->exec_all();
Run Code Online (Sandbox Code Playgroud)

Jso*_*owa 32

更新 PHP 8.1

从 PHP 8.1 开始,解包数组也适用于字符串键数组,因此错误FATAL ERROR Uncaught Error: Cannot unpack array with string key将不再适用。

例子:

$array1 = ["a" => 1];
$array2 = ["a" => 2];
$array = ["a" => 0, ...$array1, ...$array2];
var_dump($array); // ["a" => 2]
Run Code Online (Sandbox Code Playgroud)

RFC:PHP RFC:使用字符串键进行数组解包


apo*_*fos 29

问题是"splat"运算符(数组解包运算符或...)不能与关联数组一起使用.例:

$array = [1, 2, 3];
$assoc = ["one" => 1, "two" => 2, "three" => 3];

var_dump(...$array); //Works
var_dump(...$assoc); //Doesn't work
Run Code Online (Sandbox Code Playgroud)

您需要强制数组进行数字索引才能解压缩.你这样做...:

$values = array_values($q->fetch());
ModelController::execute(...$values);
Run Code Online (Sandbox Code Playgroud)

数组值将确保所有值都具有顺序数字键.

  • 这完全破坏了使用关联数组的原则,键/索引将用作 SQL 占位符匹配,所以这可能是我需要的限制?非常感谢您的解释!当我可以的时候我会标记 (13认同)
  • 我希望它能够限制函数如何使用它们的参数列表,例如``func_get_args()`总是用数字索引. (2认同)

Kaa*_*aan 5

如果在尝试将关联数组解包到另一个数组时遇到此错误,则可以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));
Run Code Online (Sandbox Code Playgroud)

会产生

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"
}
Run Code Online (Sandbox Code Playgroud)