array_walk_recursive()は便利だ

※以前別の場所で書いた文章を備忘的に書き記しておきます。

【投稿年月日】2007-11-06 【ジャンル】PHP/MySQL

 多次元配列の特定要素に対して何らかの操作をする場合、PHPではarray_walk_recursive()がお勧めです。今までarray_walk()やarray_map()については、再帰処理が面倒なこともあってあまり使っていなかったのですが、これはお手軽です。
 

【ケース1】

 多次元配列$listについて、要素catidが2のものを100に一括置換。
<?php

 $list = array(
  array("no"=>"1.5", "catid"=>"2", "body"=>"test1"),
  array("no"=>"2", "catid"=>"4", array("catid"=>"2", "body"=>"test2")),
  array("no"=>"3.2", "catid"=>"3", "body"=>"test3"),
  array("no"=>"4", "catid"=>"2", "body"=>"test4"),
  array("no"=>"5", "catid"=>"2", "body"=>"test5"),
  array("no"=>"6", "catid"=>"5", array("catid"=>"2", "body"=>"test6")),
  array("no"=>"7", "catid"=>"3", "body"=>"test7")
 );
 array_walk_recursive($list, create_function('&$val, $key', '$val = ($key=="catid" && $val==2) ? 100 : $val;'));

print_r("<pre>");
print_r($list);
print_r("</pre>");

?>


【ケース2】

 【ケース1】の多次元配列$listについて、要素bodyをhtmlspecialchars()で、その他の要素をintval()でそれぞれエスケープ。
 array_walk_recursive($list, create_function('&$val, $key', '$val = ($key=="body") ? htmlspecialchars($val) : intval($val);'));


【備忘メモ1】

 【ケース1】の多次元配列$listについて、create_function()を使わずに、別関数で処理する場合。
 array_walk_recursive($list, "changeArray");
 function changeArray(&$val, $key) {
  $val = ($key=="catid" && $val==2) ? 100 : $val;
 }


【備忘メモ2】

 【ケース1】の多次元配列$listについて、create_function()を使わずに、クラス内の別関数で処理する場合。
 array_walk_recursive($list, array($this, "changeArray"));
 function changeArray(&$val, $key) {
  $val = ($key=="catid" && $val==2) ? 100 : $val;
 }

 ケース1の配列要素の一括置換は、当初はarray_walk()を使って実現しようとしていたのですが挫折。その後、調べまわるうちにPHP5限定のarray_walk_recursive()を発見。試したところ、即座に解決して万々歳。と言うか、もう少し早く気づけよ。>自分
 今までは配列をforeach()で回してif()で条件に合う要素を取り出して置換していましたが、こっちの方が手軽かつ応用がききそうです。

EDIUNET | PHP/MySQL | 独り言 | 提供サービス | JavaScript