Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/255.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 无法使用字符串键解包数组_Php_Arrays_Argument Unpacking - Fatal编程技术网

Php 无法使用字符串键解包数组

Php 无法使用字符串键解包数组,php,arrays,argument-unpacking,Php,Arrays,Argument Unpacking,致命错误未捕获错误:无法使用字符串键解包数组 我知道我可以简单地运行方法fetch()两次,然后传递['q']和['bind'],但我正在尝试使用新的..来解压值。我想这样传递值: (string) SQL, (Array) Bind Values 但我认为它试图从fetch()方法中解包绑定值数组和响应数组。是否可以解压缩此阵列(看起来像这样:) 这是全部代码,以防您需要了解它们是如何组合在一起的: class ModelController { public static func

致命错误未捕获错误:无法使用字符串键解包数组

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

(string) SQL, (Array) Bind Values
但我认为它试图从
fetch()
方法中解包绑定值数组和响应数组。是否可以解压缩此阵列(看起来像这样:)

这是全部代码,以防您需要了解它们是如何组合在一起的:

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();
问题是(数组解包运算符或
)不能与关联数组一起使用。例如:

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

var_dump(...$array); //Works
var_dump(...$assoc); //Doesn't work
您需要强制对数组进行数字索引才能将其解压缩。您可以使用以下方法执行此操作:

数组值将确保所有值都有一个连续的数字键

更新

从PHP8开始,将支持命名参数,这将使两种情况都起作用。中记录了一个示例,其中说明以下代码应该可以在启动PHP8时使用

$params = ['start_index' => 0, 'num' => 100, 'value' => 50];
array_fill(...$params);

如果在尝试将关联数组解包到另一个数组时出现此错误,则可以改用
array\u merge


执行一个
$values=array_values($q->fetch());ModelController::执行(…$values)
完全有效!您能否回答
array\u values()
在这种情况下与解包相关的功能?如果@apokryforthis完全破坏了使用关联数组的原则,那么我们会感激@apokryforthis,因为键/索引将用作SQL占位符匹配,所以这可能是我需要的限制?谢谢你的解释!我会在我认为这是函数如何使用其参数列表的限制时标记,例如,
func\u get\u args()
总是用数字索引。看起来就像回到了绘图板上,哈哈,不过我还是很欣赏这方面的知识!如果希望以这种方式将关联数组传递给函数,请重写方法以获取数组:
function execute(array$arguments){var_dump($array['vals']);}
PHP 8.1将提供对命名参数的支持。它在PHP8.0中不可用。资料来源:
$values = array_values($q->fetch());
ModelController::execute(...$values);
$params = ['start_index' => 0, 'num' => 100, 'value' => 50];
array_fill(...$params);
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"
}