0

发生了一些奇怪的事情。

我有一个这样的数组:

=> [
     "optionalinformation" => [
       "domain" => [
         "type" => "string",
       ],
     ],
   ]

这个数组被一个资源使用,如果我使用 tinker 来检查这个资源,如下所示:

$result = App\Http\Resources\ProductResource::make(Product::find(2));

is_array($result->optionalinformation);

在这种情况下,结果是true:这是一个数组。

但是如果 axios 获取结果,我会得到这个:

"optionalinformation": {
      "domain": {
        "type": "string"
      },

它不再是一个数组,而是一个对象。任何想法为什么会发生这种情况?

这是我的 api 资源:

 /**
     * Transform the resource into an array.
     *
     * @param \Illuminate\Http\Request $request
     *
     * @return array
     */
    public function toArray($request)
    {
        return [
            'id'                      => $this->id,
            'title'                   => $this->title,
            'optionalinformation'     => $this->optionalinformation,
        ];
    }
4

2 回答 2

1

这里有一些混乱,主要是由 PHP 术语引起的。

在 PHP 术语中,关联数组仍然是一个数组。但是关联数组实际上是一个字典。

其他编程语言不会将关联数组(字典)视为数组,因此具有不同的词汇表。

您的数据结构实际上是一个字典,而不是数字索引数组。

从 JSON 的角度来看,如果您的数据结构具有非数字键,那么它将被转换为对象。

您的困惑源于这样一个事实,即is_array如果变量是基于零的索引数组,它将返回 true,而实际上它也为关联数组返回 true。

于 2020-04-27T11:26:41.413 回答
0

它在定义中。Laravel's resource classes allow you to expressively and easily transform your models and model collections into JSON.检查资源文档

如果您期望返回一个数组,那么我建议跳过资源并使用->toArray(). 但是你又axios在你的 vuejs 中使用了,那么我强烈建议你坚持使用json格式作为预期的响应。

于 2020-04-27T11:28:29.023 回答