さとうさんのキロク

生活と雑記と時々ネコ

【PHP】多次元配列(2次元配列)のキー名指定による列削除

(今回の自分的要件)2次元配列の特定列を一気に削除する方法の1つ

自分のためのメモ的なものでもあるけども、PHPをそこそこ読める人が見てもわかるようにまとめてみます。
そもそもDBから引いてくるときにこの列使わんなら指定するなって話でもあるけど、1つのネタ的なものとして。


まずは以下の様なデータがあったとします。

ITEM_ID ITEM_NAME SHOP_ID URIAGE
9 やくそう 2 100
5 聖水 5 500
1 毒消し草 2 250
2 たいまつ 1 550
9 やくそう 1 150


上記の表をPHPの多次元配列に直すと以下のようになります。

<?php
$item_array = array(
          array('ITEM_ID' => 9, 'ITEM_NAME' => 'やくそう','SHOP_ID' => 2, 'URIAGE' => 100 ),
          array('ITEM_ID' => 5, 'ITEM_NAME' => '聖水','SHOP_ID' => 5, 'URIAGE' => 500 ),
          array('ITEM_ID' => 1, 'ITEM_NAME' => '毒消し草','SHOP_ID' => 2, 'URIAGE' => 250 ),
          array('ITEM_ID' => 2, 'ITEM_NAME' => 'たいまつ','SHOP_ID' => 1, 'URIAGE' => 550 ),
          array('ITEM_ID' => 9, 'ITEM_NAME' => 'やくそう','SHOP_ID' => 1, 'URIAGE' => 150 ),
);
?>


さて、このデータの「URIAGE」列を一気に消したいとします。
そのためには、for文やforeachを用いてループしながらunset関数・・とするのが妥当かもしれません。
できる事は多数あるので、どれが最適かについてはここでは述べませんが、パフォーマンスなどを考えるならいろいろあると思います。
それは実装の環境や設計内容等によっても変わってくるでしょうから、状況に応じて対応するといいと思います。


話を戻しますと、「URIAGE」列を一気に消す方法の1つとして以下の様なことができます。

<?php
function array_col_delete(&$row, $key, $key_name) {
    unset($row[$key_name]);
}

$key_name = "URIAGE";
array_walk($item_array, "array_col_delete", $key_name);
?>

これは、「array_walk」という関数を利用し、配列の全行に対してユーザー定義関数の処理をするというもの。


array_walk関数に、先ほど定義した$item_array配列をセットし、私が定義した関数 array_col_delete を指定すると
array_walk関数が$item_array配列を行単位で実行してくれます。
と同時に外から渡されている「URIAGE」キーのものをunset関数で削除処理します。


また、array_col_delete関数の配列を受け取る場所、、つまり、&$rowは参照渡しを指定として宣言しているため
渡されてきた$item_array配列そのものを直接編集することによって、「URIAGE」列のデータを削除しています。
これは、array_walk関数の返り値にarray_col_delete関数の結果を返すことが出来ないためです。


実行結果として$item_arrayは以下の様なデータに変わっています。

ITEM_ID ITEM_NAME SHOP_ID
9 やくそう 2
5 聖水 5
1 毒消し草 2
2 たいまつ 1
9 やくそう 1


以上、使うかどうかわからない、多次元配列の列削除方法の1つをご紹介でした。
このarray_walk関数は配列を扱うにあたって無数の使い道があるので、様々なユーザ関数を設定し配列をこね回すことができます。

以下一気にサンプルとして貼り付けたい人用( いるかどうかわからないケド )

<?php
$item_array = array(
          array('ITEM_ID' => 9, 'ITEM_NAME' => 'やくそう','SHOP_ID' => 2, 'URIAGE' => 100 ),
          array('ITEM_ID' => 5, 'ITEM_NAME' => '聖水','SHOP_ID' => 5, 'URIAGE' => 500 ),
          array('ITEM_ID' => 1, 'ITEM_NAME' => '毒消し草','SHOP_ID' => 2, 'URIAGE' => 250 ),
          array('ITEM_ID' => 2, 'ITEM_NAME' => 'たいまつ','SHOP_ID' => 1, 'URIAGE' => 550 ),
          array('ITEM_ID' => 9, 'ITEM_NAME' => 'やくそう','SHOP_ID' => 1, 'URIAGE' => 150 ),
);

function array_col_delete(&$row, $key, $key_name) {
    unset($row[$key_name]);
}

$key_name = "URIAGE";
array_walk($item_array, "array_col_delete", $key_name);

var_dump($item_array);

?>