2015-12-14 260 views
-3

我有这样的代码:如何在数组中将所有值设置为false?

$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->rowCount() == ''

[] 

我想要什么:(当有ISN” t any rows $sth->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"); 
+1

你会更好发送任何数据,也许是一个404响应,而不是具有错误值的数组。 – Andrew

+0

1)你可以计算出你的循环做了多少次迭代,所以如果你没有做,可以在它上面加一轮'false'。 2)这是一个奇怪的数据结构。一个*数组*是容纳许多东西的容器。如果没有它应该保留的东西,它应该是空的。拥有一个“false”类型来表示它是空的是奇怪的。 – deceze

+1

您也可以返回一个错误对象,表示找不到数据和状态码。 – Daan

回答

3

启动阵列空值:

$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"部分扩大,看着数据,似乎值逻辑数据库(一个行包含相关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循环等

+0

谢谢,但是如果我想在没有结果时保留'null'的值,我可以使用'do-while()'而不是你写的东西...... – stack

+0

这归结为API设计,而不是任何特定的编程语言。但是,返回值数组的api通常会返回一个空数组(如果没有的话)。返回数组或false是不一致的,并且要求消费者为所有代码添加guard子句。 – Steve

+0

好吧,只有一件事:数据结构很好?它们可用于其他开发人员甚至移动应用程序? – stack

1

返回错误对象保持一致性,很容易在客户端捉:

说你这回如果没有数据发现:

$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. 
} 
+0

你的意思是我没有返回任何*(甚至'null')*当没有找到任何结果? – stack

+0

@stack完全不会返回数据对象。 – Daan

+0

好的,看起来不错+1,但有一点,数据结构是好的?这是标准吗?人们可以在客户端使用它?或者我应该向他们展示一些其他模式? – stack

相关问题