たとえば…
こういう配列があったとしましょう。
<?php
$results = array();
$results[] = array("success_count"=>"0", "failure_count"=>"1");
$results[] = array("success_count"=>"1", "failure_count"=>"0");
array(2) {
[0]=>
array(2) {
["success_count"]=>
string(1) "0"
["failure_count"]=>
string(1) "1"
}
[1]=>
array(2) {
["success_count"]=>
string(1) "1"
["failure_count"]=>
string(1) "0"
}
}
全ての要素をintにしたい…!
クエリを叩いたりなんかして、全部の結果がint型も含めて全部Stringは困る…って場面があると思います。
例えば、このsuccess_count
が1件以上あったら、みたいな数値としての比較をしたい時にどうすれば良いか。
やってみた
array_mapを使うやり方もあるのですが、今回はforeach
を使ってやってみました。
<?php
$results = array();
$results[] = array("success_count"=>"0", "failure_count"=>"1");
$results[] = array("success_count"=>"1", "failure_count"=>"0");
foreach($results as &$result){
$result["success_count"] = (int)$result["success_count"];
$result["failure_count"] = (int)$result["failure_count"];
}
unset($result);
出力
array(2) {
[0]=>
array(2) {
["success_count"]=>
int(0)
["failure_count"]=>
int(1)
}
[1]=>
array(2) {
["success_count"]=>
int(1)
["failure_count"]=>
int(0)
}
}
ちょこっとポイント
foreachで回す時に、リファレンスを渡すことでforeachを抜けた後もキャストした値は捨てられずに配列に格納されます。
foreach($results as &$result){
ここで注意しなければならないのが、foreachを抜けた後にunset()
を使って参照を解除してあげなければならないことです。
foreach($results as &$result){
$result["success_count"] = (int)$result["success_count"];
$result["failure_count"] = (int)$result["failure_count"];
}
unset($result); //ここで$resultの参照を解除
参照が解除されないままだと、最後の要素の値がどこか意図しないタイミングで書き換えられてしまう可能性があります。
PHPの公式マニュアルに詳細が載っていますので、こちらもぜひ一読ください。
foreach($results as &$result){
$result["success_count"] = (int)$result["success_count"];
$result["failure_count"] = (int)$result["failure_count"];
}
//unset($result);
$result["success_count"] = 10000; //参照を保ったまま最後の要素の値を書き換え
出力
array(2) {
[0]=>
array(2) {
["success_count"]=>
int(0)
["failure_count"]=>
int(1)
}
[1]=>
&array(2) {
["success_count"]=>
int(10000)
["failure_count"]=>
int(0)
}
}