備忘録

PHPで二次元配列(多次元配列)を文字列に変換

PHP

二次元配列のデータをログに出力したかったので、配列を文字列に変換する方法を調べた時の簡単なメモ

データベースからデータを抽出した結果をそのままログとして出力したかったので、簡単にできないか調べてみました。

serialize

serialize関数は値の保存可能な表現を生成します。

復元するにはunserialize関数を使用します。

serialize ( mixed $value ) : string

$arr = array(
			array(
				'zip'     => '〒102-8688',
				'address' => '東京都千代田区九段南1-2-1',
				'name'    => '千代田区役所',
			),
			array(
				'zip'     => '〒104-8404',
				'address' => '東京都中央区築地一丁目1番1号',
				'name'    => '中央区役所',
			),
		);

echo serialize($arr);

// 結果
// a:2:{i:0;a:3:{s:3:"zip";s:11:"〒102-8688";s:7:"address";s:35:"東京都千代田区九段南1-2-1";s:4:"name";s:18:"千代田区役所";}i:1;a:3:{s:3:"zip";s:11:"〒104-8404";s:7:"address";s:41:"東京都中央区築地一丁目1番1号";s:4:"name";s:15:"中央区役所";}}

json_encode

json_encode関数はJSONエンコードされた文字列を返します。失敗した場合に FALSE を返します。

復元するにはjson_decode関数を使用します。

json_encode ( mixed $value [, int $options = 0 [, int $depth = 512 ]] ) : string

$arr = array(
			array(
				'zip'     => '〒102-8688',
				'address' => '東京都千代田区九段南1-2-1',
				'name'    => '千代田区役所',
			),
			array(
				'zip'     => '〒104-8404',
				'address' => '東京都中央区築地一丁目1番1号',
				'name'    => '中央区役所',
			),
		);

echo json_encode($arr);

// 結果
// [{"zip":"\u3012102-8688","address":"\u6771\u4eac\u90fd\u5343\u4ee3\u7530\u533a\u4e5d\u6bb5\u53571-2-1","name":"\u5343\u4ee3\u7530\u533a\u5f79\u6240"},{"zip":"\u3012104-8404","address":"\u6771\u4eac\u90fd\u4e2d\u592e\u533a\u7bc9\u5730\u4e00\u4e01\u76ee1\u756a1\u53f7","name":"\u4e2d\u592e\u533a\u5f79\u6240"}]

http_build_query

http_build_query関数はURLエンコードされた文字列を返します。

復元するにはparse_str関数を使用します。

http_build_query ( mixed $query_data [, string $numeric_prefix [, string $arg_separator [, int $enc_type = PHP_QUERY_RFC1738 ]]] ) : string

$arr = array(
			array(
				'zip'     => '〒102-8688',
				'address' => '東京都千代田区九段南1-2-1',
				'name'    => '千代田区役所',
			),
			array(
				'zip'     => '〒104-8404',
				'address' => '東京都中央区築地一丁目1番1号',
				'name'    => '中央区役所',
			),
		);

echo http_build_query($arr);

// 結果
// 0%5Bzip%5D=%E3%80%92102-8688&0%5Baddress%5D=%E6%9D%B1%E4%BA%AC%E9%83%BD%E5%8D%83%E4%BB%A3%E7%94%B0%E5%8C%BA%E4%B9%9D%E6%AE%B5%E5%8D%971-2-1&0%5Bname%5D=%E5%8D%83%E4%BB%A3%E7%94%B0%E5%8C%BA%E5%BD%B9%E6%89%80&1%5Bzip%5D=%E3%80%92104-8404&1%5Baddress%5D=%E6%9D%B1%E4%BA%AC%E9%83%BD%E4%B8%AD%E5%A4%AE%E5%8C%BA%E7%AF%89%E5%9C%B0%E4%B8%80%E4%B8%81%E7%9B%AE1%E7%95%AA1%E5%8F%B7&1%5Bname%5D=%E4%B8%AD%E5%A4%AE%E5%8C%BA%E5%BD%B9%E6%89%80

var_export

var_export関数は構造化された情報を返します。

var_export ( mixed $expression [, bool $return = FALSE ] ) : mixed

$arr = array(
			array(
				'zip'     => '〒102-8688',
				'address' => '東京都千代田区九段南1-2-1',
				'name'    => '千代田区役所',
			),
			array(
				'zip'     => '〒104-8404',
				'address' => '東京都中央区築地一丁目1番1号',
				'name'    => '中央区役所',
			),
		);

echo var_export($arr);

// 結果
// array ( 0 => array ( 'zip' => '〒102-8688', 'address' => '東京都千代田区九段南1-2-1', 'name' => '千代田区役所', ), 1 => array ( 'zip' => '〒104-8404', 'address' => '東京都中央区築地一丁目1番1号', 'name' => '中央区役所', ), )

implode

implode関数は配列要素を文字列により連結します。

implode ( string $glue , array $pieces ) : string

$arr = array(
			array(
				'zip'     => '〒102-8688',
				'address' => '東京都千代田区九段南1-2-1',
				'name'    => '千代田区役所',
			),
			array(
				'zip'     => '〒104-8404',
				'address' => '東京都中央区築地一丁目1番1号',
				'name'    => '中央区役所',
			),
		);

echo implode('=', $arr);

// 結果
// Notice: Array to string conversion (※二次元配列ではNoticeレベルのエラーになります。)

多次元配列を文字列に変換する関数を作成

いろいろと試した結果、復元する必要もなくログに必要のないものまで含まれてしまうので、多次元配列を文字列に変換する関数を作ることにしました。

MySQLで取得した配列を、そのまま引数にして関数(chgArrToStr)を呼び出すだけで、文字列として返してくれます。また、三次元・四次元配列にも対応しています。

使い方

$arr = array(
			array(
				'zip'     => '〒102-8688',
				'address' => '東京都千代田区九段南1-2-1',
				'name'    => '千代田区役所',
			),
			array(
				'zip'     => '〒104-8404',
				'address' => '東京都中央区築地一丁目1番1号',
				'name'    => '中央区役所',
			),
		);

echo chgArrToStr($arr);

// 結果
// [0][zip]=〒102-8688、[0][address]=東京都千代田区九段南1-2-1、[0][name]=千代田区役所、[1][zip]=〒104-8404、[1][address]=東京都中央区築地一丁目1番1号、[1][name]=中央区役所

多次元配列を文字列に変換

/**
 * 多次元配列を文字列に変換
 * 引数:配列
 * 引数:キー(再帰用)
 * 戻値:文字列
 */
function chgArrToStr($arrValue, $beforeKey='') {
	$delimiter1 = '=';
	$delimiter2 = '、';
	$arrWork    = array();
	if (is_array($arrValue) === true) {
		foreach ($arrValue as $key=>$row) {
			if (is_array($row) === true) {
				$arrWork[] = chgArrToStr($row, sprintf('%s[%s]', $beforeKey, $key));
			} else {
				$arrWork[] = sprintf("%s[%s]{$delimiter1}%s", $beforeKey, $key, $row);
			}
		}
	} else {
		$arrWork[] = $arrValue;
	}
	return implode($delimiter2, $arrWork);
}