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>");
?>
$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;
}
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;
}
function changeArray(&$val, $key) {
$val = ($key=="catid" && $val==2) ? 100 : $val;
}
ケース1の配列要素の一括置換は、当初はarray_walk()を使って実現しようとしていたのですが挫折。その後、調べまわるうちにPHP5限定のarray_walk_recursive()を発見。試したところ、即座に解決して万々歳。と言うか、もう少し早く気づけよ。>自分
今までは配列をforeach()で回してif()で条件に合う要素を取り出して置換していましたが、こっちの方が手軽かつ応用がききそうです。
EDIUNET | PHP/MySQL | 独り言 | 提供サービス | JavaScript