【问题标题】:How do I generate a JSON like this? [closed]如何生成这样的 JSON? [关闭]
【发布时间】:2013-03-01 10:12:10
【问题描述】:

Helo 伙计们。我有必须遵循的 JSON 结构,但我不知道如何使用 PHP 创建这个东西。我尝试使用两个 foreach 和数组,但是当我开始第三级(例如 urlMiniatura)时,我总是会出错,因为它们需要有标签,(urlMiniatura)我的数组总是接收指针作为索引。

JSON 示例:

    {
  "Tipo de ambiente 1" : {
    "ID ambiente 1" : {
      "urlMiniatura" : "http://url-absoluta-da-imagem",
      "titulo" : "Nome do ambiente",
    },
    "ID ambiente 2" : {
      "urlMiniatura" : "http://url-absoluta-da-imagem",
      "titulo" : "Nome do ambiente",
    },
    (...)
    "ID ambiente N" : {
      "urlMiniatura" : "http://url-absoluta-da-imagem",
      "titulo" : "Nome do ambiente",
    }
  },
  (...)
  "Tipo de ambiente N" : {
    "ID ambiente 1" : {
      "urlMiniatura" : "http://url-absoluta-da-imagem",
      "titulo" : "Nome do ambiente",
    },
    "ID ambiente 2" : {
      "urlMiniatura" : "http://url-absoluta-da-imagem",
      "titulo" : "Nome do ambiente",
    },
    (...)
    "ID ambiente N" : {
      "urlMiniatura" : "http://url-absoluta-da-imagem",
      "titulo" : "Nome do ambiente",
    }
  }
}

我的代码:

foreach ($this->conteudo['tipos_ambientes'] as $linha => $tipo_ambiente_item){
    //Seta valores do ambiente
    $array_retorno[$linha] = $tipo_ambiente_item['tipo_ambiente'];
    //Carrega ambientes
    $conteudo['ambientes'] = $this->ambiente_model->get_ambientes_api_by_codigo_tipo_and_codigo_tipo_ambiente(1, $tipo_ambiente_item['codigo_tipo_ambiente']);
    if ($conteudo['ambientes'] != null){
        foreach($conteudo['ambientes'] as $linha_interna => $ambiente){
            $array_retorno[$linha][$linha_interna] = $ambiente['codigo_ambiente'];
            $array_retorno[$linha][$linha_interna]['urlMiniatura'] = $ambiente['arquivo'];
        }
    }
}
$json = json_encode($allLinks);

【问题讨论】:

  • 你遇到了什么错误?
  • 错误是什么?
  • 错误在以下行:$array_retorno[$linha][$linha_interna]['urlMiniatura'] = $ambiente['arquivo'];
  • 这里的否决票在 imo 中是不合理的 - OP 已经清楚地说明了他们的问题,并且已经做出了事先的努力。诚然,如果有错误,最好知道它是什么(!),但 5 次反对票显然是不合理的,要求查看 OP 尝试了什么(@Nirav)也是如此。
  • Cannot use string offset as an array in is error.

标签: php json libraries


【解决方案1】:

问题

您已声明错误消息是Cannot use string offset as an array

当您尝试将数组元素添加到字符串变量时会发生此错误。

例如:

$myString = "some text";
$myString['arrayKey'] = "more text";

第二行会失败,因为变量是字符串,不能这样作为数组使用。

那么这与您的代码有何关系?

$array_retorno[$linha][$linha_interna] = $ambiente['codigo_ambiente'];
$array_retorno[$linha][$linha_interna]['urlMiniatura'] = $ambiente['arquivo'];

在上面的代码中,您所做的事情与我引用的示例代码非常相似;主要区别在于您有很多数组嵌套,这使得更难确切地看到正在发生的事情,但基本问题是相同的。

问题在于$ambiente['codigo_ambiente'] 是一个字符串值,因此在第一行之后,$array_retorno[$linha][$linha_interna] 也将是一个字符串。

然后在第二行,你尝试向这个字符串添加一个数组元素,我们得到了错误。

如何解决?

其意图显然是将$array_retorno[$linha][$linha_interna] 作为一个包含$ambiente['codigo_ambiente']$ambiente['arquivo'] 的数组。

所以我们需要替换代码,以便将它们创建为数组,如下所示:

$array_retorno[$linha][$linha_interna] = array(
    'titulo' => $ambiente['codigo_ambiente'],
    'urlMiniatura' => $ambiente['arquivo']
);

(我从您的 JSON 示例中获取了数组键名称 titulo

希望对你有帮助。

【讨论】:

  • 解决了我的问题,谢谢!
【解决方案2】:

这取决于您输入的格式。但是假设您有一个由结构生成的数组,PHP 公开了json_encode,您可以使用它来将其转换为 JSON。例如:

<?php
  $arr = array('a' => 1, 'b' => 2, 'c' => 3, 'd' => 4, 'e' => 5);
   echo json_encode($arr);
?>

{"a":1,"b":2,"c":3,"d":4,"e":5}

显然,根据您的更新,您使用此方法,但 $allLinks 没有显示为任何内容。

【讨论】:

  • 是的,但是这个结构不参加我提到的结构。
  • 所以把你的结构放入。但它一定是个东西。
【解决方案3】:

试试这个:

$json = json_encode($allLinks);这是错误的,你没有分配$allLinks

我猜应该是$json = json_encode($array_retorno);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多