【问题标题】:How to set all values to false in array?如何将数组中的所有值设置为false?
【发布时间】:2015-12-14 14:29:06
【问题描述】:

我有这样的代码:

$iterator = 0;
while (($end = $sth->fetch()) && $iterator < 2)
{
    $api_arr["data"]['tc'][] =  $end["tc"];
    $api_arr["data"]['em'][] =  $end["em"];
    $api_arr["data"]['sg'][] =  $end["sg"];

    $iterator ++;
}

我正在为其他开发人员创建我的网站的 API。我给他们一个 JSON 输出。像这样的:

{
   -data{
       tc: [
         "value_tc_1",
         "value_tc_2",
         "value_tc_3" 
       ],

       em: [
         "value_em_1",
         "value_em_2",
         "value_em_3" 
       ],

       sg: [
         "value_sg_1",
         "value_sg_2",
         "value_sg_3" 
       ]
   }
}

当前输出: (当没有任何行时$sth-&gt;rowCount() == ''

[]

我想要什么: (当没有任何行时$sth-&gt;rowCount() == ''

{
   -data{
       tc: [false],
       em: [false],
       sg: [false]
   }
}

嗯,我该怎么做呢?


作为咨询:在没有结果的情况下是否必须将false设置为数组的值?我从未有过创建 API 的经验。我想根据一些类似的 API 设置false(来自其他网站)

实际上,我想向其他开发人员展示一个可以使用的标准。那么,作为 API,我所做的是正确的吗?其他开发者可以使用吗?

我不知道,也许我需要的是这个:

{
   -data{
       tc: false,
       em: false,
       sg: false
   }
}

一般来说,我有什么需要知道的吗? {预先感谢:)}


我尝试了什么:我认为这样的东西会很有用,但实际上我不知道我应该如何使用它:

array_fill_keys(array_keys($api_arr['data']), "false");

【问题讨论】:

  • 你最好发送一个无数据,也许是一个 404 响应,而不是带有错误值的数组。
  • 1) 您可以计算出您已经完成了循环的多少次迭代,因此如果您没有执行任何操作,请在其中添加一轮 false。 2)这是一个奇怪的数据结构。 array 是一个容纳许多东西的容器。如果它没有应该容纳的东西,它应该只是空的。让它拥有一个false 类型的东西来表示它是空的,这很奇怪。
  • 你也可以返回一个错误对象,表示没有找到数据和一个状态码。
  • 您正在开发 REST API 吗?然后你会在 REST 协议的文档(描述)中找到你的一些问题的答案。如果您不开发 REST API,那么您应该与实现客户端部分的开发人员讨论此数据结构的外观。
  • @deceze “这是一个奇怪的数据结构。”,嗯,你说的正是我需要听到的。那么我应该如何显示数据呢? ?这个更好$api_arr["data"][]['tc'] = $end["tc"];

标签: php arrays array-key


【解决方案1】:

用空值初始化数组:

$iterator = 0;
$api_arr = [
    'data'=>
        [
            'tc'=>[],
            'em'=>[],
            'sg'=>[]
        ]
    ];

while (($end = $sth->fetch()) && $iterator < 2)
{
    $api_arr["data"]['tc'][] =  $end["tc"];
    $api_arr["data"]['em'][] =  $end["em"];
    $api_arr["data"]['sg'][] =  $end["sg"];

    $iterator ++;
}

如果数据库中没有结果,结果将是:

{
   data{
       tc: [],
       em: [],
       sg: []
   }
}

这对于期望包含数组的数据结构的 API 使用者来说是一致的。可能整个结构都可以重构,但一致性是一个好的开始

为了扩展"the whole structure can be refactored"part,查看数据,似乎这些值在数据库中进行了逻辑分组(一行包含相关的tcemsg 单元格),但您将它们分开在 API 中没有明确的原因。

更好的结构是遵循数据库的结构:

$iterator = 0;
$data = [];
while (($end = $sth->fetch()) && $iterator < 2)
{
    $data[] =  [
        'tc'=> $end["tc"],
        'em'=> $end["em"],
        'sg'=> $end["sg"]
   ];
    $iterator ++;
}
header('Content-Type: application/json');
echo json_encode([data=>$data]);

这将输出:

{
    data:[
       {tc: value_tc_1, em: value_em_1, sg: value_sg_1},
       {tc: value_tc_2, em: value_em_2, sg: value_sg_2},
       {tc: value_tc_3, em: value_em_3, sg: value_sg_3}
    ]
}

当你有结果时,并且:

{
    data:[]
}

当没有结果时。

消费者代码可以是例如(再次使用php,可以是任何语言):

 $response = json_decode(file_get_contents($apiEndpoint));
 foreach($response->data as $element){
     echo '<tr><td>' . $element->tc . '</td><td>' . $element->em . '</td><td>' . $element->sg . '<td></tr>';
 }

而且无论你的 api 是否返回结果,消费者代码都运行良好(如果没有结果则显示一个空表)。

最后一点,如果您的 SQL 更具体地说明您想要什么,例如:

SELECT tc, em, sg FROM tablename LIMIT 3

那么你的整个php代码就变成了:

header('Content-Type: application/json');
echo json_encode([data=>$sth->fetchAll()]);

不需要迭代器、while循环等

【讨论】:

  • 谢谢,但是如果我想在没有结果的情况下保留null 的值,我可以使用do-while() 而不是你写的...
  • 这归结为 API 设计,而不是任何特定的编程语言。但是,如果没有返回值数组,通常会期望返回一个空数组的 api。返回数组或 false 不一致,需要消费者在所有代码中添加保护子句。
  • 啊,好吧,只有一件事:数据结构好吗?它们可用于其他开发人员甚至是移动应用程序?
  • 嗯,第一个更接近我推荐的,但仍然有点坏。你不想要data:{ 0:{}, 1:{}, ...} 你想要data:[{},{}, ...] 我什至不确定你是如何设法将输出排在第一位的,json_encode 应该将顺序的、数字索引的数组转换为数组,而不是对象
  • 它之所以重要的原因是因为一个数组几乎可以用任何语言通过一个简单的循环进行迭代,但是一个对象更难遍历。
【解决方案2】:

返回一个错误对象保持一致性,并且很容易在客户端捕获:

如果没有找到数据,假设你返回这个:

$api_arr["error"]["code"] = 404;
$api_arr["error"]["message"] = "No data found";

现在在客户端,在 ajax 请求中,有人可以轻松做到这一点:

try {
   if(typeof ajaxObj.error != 'undefined'){
        throw ajaxObj.error;
   }

   //Data is found
} catch(errObj) {
   //Handle the error object.
}

【讨论】:

  • 当没有找到任何结果时,你的意思是我什么都不返回(甚至null
  • @stack 根本不返回数据对象。
  • 好吧,看起来不错+1,但是有一点,数据结构还可以吗?它是标准的吗?人们可以在客户端使用它吗?还是我应该向他们展示其他模式?
  • 这很好,我在应用程序中看到过。但是,我建议为其他开发人员创建文档,这样他们就知道他们可能会遇到错误或数据对象。
  • 是的,这很好,它可以在安卓应用程序以及客户端请求中运行。
猜你喜欢
  • 2016-01-22
  • 2016-06-24
  • 2018-03-11
  • 2014-12-27
  • 1970-01-01
  • 2015-10-31
  • 1970-01-01
  • 2014-01-19
  • 2021-09-04
相关资源
最近更新 更多