2017-03-16 26 views
1

我使用CakePHP框架。我有一個對應於模型記錄的數組。我必須按照這種方式處理它,所有整數和浮點數都是整數和浮點數,就像java中沒有引號(11111.1而不是這個'111.1''11.1')。我找到了以這種方式返回所有值的方法:return json_encode($data, JSON_NUMERIC_CHECK);。問題是:有什麼辦法可以排除某些數字字段以這種方式出現?換句話說:我有兩個數字字段:field1field2,他們必須用引號。同時所有其他數字字段必須不帶引號。我怎麼能實現這個? 我的陣列看起來如此:使用JSON_NUMERIC_CHECK排除json_encode()中的某些值

array(
    (int) 0 => array(
     'password' => '*****', 
     'id' => '2', 
     'number' => '2', 
     'debtor_number' => null, 
     'name' => 'Ziegler', 
     'firstname' => 'Lisa', 
     'address' => 'Frau', 
     'title' => '', 
     'name_extension' => '', 
     'company' => '', 
     'company_function' => '', 
     'street' => 'Feldbergstr. 13-15', 
     'street2' => null, 
     'postbox' => '', 
     'street_or_postbox' => '1', 
     'zip' => '60318', 
     'city' => 'Frankfurt am Main', 
), 
    (int) 1 => array(
     'password' => '*****', 
     'id' => '3', 
     'number' => '3', 
     'debtor_number' => null, 
     'name' => 'Trappatoni', 
     'firstname' => 'Günther', 
     'address' => 'Herr', 
     'title' => '', 
     'name_extension' => '', 
     'company' => '', 
     'company_function' => '', 
     'street' => 'Trilluper Weg 17', 
     'street2' => null, 
     'postbox' => '', 
     'street_or_postbox' => '1', 
     'zip' => '60594', 
     'city' => 'Frankfurt am Main', 
+0

有沒有本地'json_encode'這個選項,你將不得不通過所有的領域進行迭代,並做'strval(..)'上的數字,你想擁有作爲字符串。 – apokryfos

回答

1

首先,如何JSON_NUMERIC_CHECK作品的一個小例子:

$data = [112, '34', 5.6, '7.8']; 
echo json_encode($data) . PHP_EOL; 
echo json_encode($data, JSON_NUMERIC_CHECK) . PHP_EOL; 

... prints

[112,"34",5.6,"7.8"] 
[112,34,5.6,7.8] 

沒有任何功能以確定哪些值應該被解析(如果他們想添加它,它的語法是什麼?)。獲得所需結果的唯一方法是確保源數據已使用適當的PHP數據類型。而這件事情你一定能做到(儘管具體細節取決於你的規格):

$person = [ 
    'age' => 33, 
    'zip_code' => '09007', 
]; 
$person['age'] = is_null($person['age']) ? null : (int)$person['age']; 
echo json_encode($person); 

...打印:

{"age":33,"zip_code":"09007"} 
+0

我正在使用CakePHP框架。數據以我在帖子中提到的方式傳遞。 – Vladislav

+0

我仍然不知道你的確切規格。我想你可以查看[用Map/Reduce修改結果](https://book.cakephp.org/3.0/en/orm/retrieving-data-and-resultsets.html#modifying-results-with-map-reduce) 。但這是一個完全不同的問題。 –

0

對於此問題的另一個解決方案,如果爲你解決它足夠重要它將以一種可靠的方式使用,那就是使用JMS Serializer library.

您需要爲您的數據定義一個類,但在此之後,無論您通過註釋定義的任何類型將在序列化過程中得到遵守。

就這樣說,阿爾瓦羅的帖子顯示,鑄造將工作。所以,這樣的事情也應該工作:

// Fix all Numerics 
$data = json_decode(json_encode($data, JSON_NUMERIC_CHECK), true); 
// Fix your 2 strings 

$callback = function($row) { 
    if (array_key_exists('field1', $row)) { 
     $row['field1'] = (string)$row['field1']; 
    } 

    if (array_key_exists('field2', $row)) { 
     $row['field2'] = (string)$row['field2']; 
    } 
    return $row; 
} 

$data = array_map($callback, $data); 
// This should be ready for final encode 

return json_encode($data);