LoginSignup
1
0

More than 3 years have passed since last update.

[PHP]foreachで配列の中の要素をまとめてキャストする

Last updated at Posted at 2019-12-23

たとえば…

こういう配列があったとしましょう。

<?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)
  }
}
1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0