以整数形式返回result_array()元素之一


Returning one of the result_array() elements as an integer

这篇文章非常有用: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"
  }
}