这篇文章非常有用:MySQL integer field is returned as string in PHP
在我的模型中,我有一个result_array()
,我希望每个'row'(bookID
)中的六个元素中的一个在返回控制器时成为INT。
$bookList = $this->db->query('SELECT bookID....etc')->result_array();
我的var_dump产生了这个..
1 =>
array (size=6)
'ownerID' => string '6' (length=1)
'bookID' => string '53' (length=2)
'address' => string '123 main road to wherever' (length=25)
'Company' => string 'xxxxxxxxxx xxxxxxxx' (length=18)
'FullName' => string 'John Smith' (length=10)
2 => ...etc...
3 => ...etc...
4 => ...etc...
1 =>
array (size=6)
'ownerID' => string '6' (length=1)
'bookID' => int 53
'address' => string '123 main road to wherever' (length=25)
'Company' => string 'xxxxxxxxxx xxxxxxxx' (length=18)
'FullName' => string 'John Smith' (length=10)
2 => ...etc...
3 => ...etc...
4 => ...etc...
迭代结果数组的最有效方法是什么,它可能有1,000行,在将结果返回给调用函数之前将第二个元素从字符串更改为INT?
return $bookList;
答案 0 :(得分:0)
我想到你可以使用array_map()
原生函数。它将您定义的函数应用于数组的每个元素,并在应用该函数后返回最终数组。
我做了一个例子,因为我喜欢这个功能:
<pre>
<?
$results = array(
array(
"val" => "1",
"name" => "maria"
),
array(
"val" => "10",
"name" => "jorge"
)
);
function castToInt($array) {
$array['val'] = (int) $array['val'];
return $array;
}
var_dump(array_map('castToInt', $results));
?>
</pre>
你var_dump(...)
给你这个输出:
array(2) {
[0]=>
array(2) {
["val"]=>
int(1)
["name"]=>
string(5) "maria"
}
[1]=>
array(2) {
["val"]=>
int(10)
["name"]=>
string(5) "jorge"
}
}
答案 1 :(得分:0)
要问的问题是:result_array()
(或者这个包装器)如何知道哪个类型/哪个列要转换为哪种类型?
在任何情况下,您都需要遍历所有返回的行(只是因为您想要更改每一行)。然后你可以像这样做一个检查
foreach ($rows as &$row) {
foreach ($row as &$column) {
if ( (int) $column == $column )
$column = (int) $column;
}
}
如果您对&
感到恼火,我建议the official manual(搜索&#34; 参考&#34;)。但是,这个方法需要相当长的时间 - 只是因为它将遍历每一行中的每一列并尝试找出是否转换为整数(简单的相等不应该是真正的检查,但在这里作为一个片段) )。
为了省去一些时间,您需要定义哪个列应该转换为哪种类型。我建议为此创建一些结构,例如数组 - 如果你想稍后修改它,硬编码的解决方案会给你额外的悲伤。例如像这样
$ints = array('ownerID', 'bookID');
foreach ($rows as &$row) {
foreach ($ints as $intKey) {
$row[ $intKey ] = (int) $row[ $intKey ];
}
}
现在可以使用原生功能加快速度,例如array_map()
D. Melo所示的{{3}}。