这篇文章非常有用:MySQL整数字段在PHP中作为字符串返回
在我的模型中,我有一个result_array()
,其中我希望每个'行' (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...
遍历结果数组(可能有1000行)的最有效方法是什么?在将结果返回给调用函数之前,将第二个元素从字符串更改为INT ?
return $bookList;
要问的问题是:result_array()
(或它的包装器)如何知道哪个列是哪个类型/要转换为哪个类型?
在任何情况下,您都需要遍历所有返回的行(仅仅因为您希望更改每一行)。然后你可以像这样检查
foreach ($rows as &$row) {
foreach ($row as &$column) {
if ( (int) $column == $column )
$column = (int) $column;
}
}
如果您对&
感到恼火,我建议您查看官方手册(搜索"参考")。然而,这个方法将花费相当长的时间——因为它将遍历每一行中的每一列,并试图找出转换为整数是否会改变一些东西(简单的相等不应该是真正的检查,而是在这里作为一个代码片段)。
为了节省一些时间,您需要定义应该将哪个列转换为哪个类型。我建议为此创建一些结构,比如一个数组——如果你以后想修改它,一个硬编码的解决方案会给你带来额外的麻烦。例如:
$ints = array('ownerID', 'bookID');
foreach ($rows as &$row) {
foreach ($ints as $intKey) {
$row[ $intKey ] = (int) $row[ $intKey ];
}
}
现在可以使用本地函数加速,例如D. Melo的答案中所示的array_map()
。
我想到可以使用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"
}
}