2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

テコテックAdvent Calendar 2017

Day 7

オブジェクトを全部配列に変換する再起プログラムを振り返る。

Last updated at Posted at 2017-12-06

そもそも

テンプレートエンジンにPHPから値を渡す際に
以下の2通りの書き方をコーディングする方に説明するのが大変で

オブジェクトでデータを渡す場合:{$aaa->name}
配列でデータを渡す場合:{$aaa.name}

いっそのことオブジェクトを配列に変換してしまい
コーディングする方には
{$aaa.name}
で統一してもらおうという事で作り始めました。

自分で作ったものの、再起プログラムは少し苦手意識がありましたが
知らない所で別のプロジェクトで関数を使われていたのを知ったでこれを気に見直して見る。

参考プログラム

toArray()

自分の中から「GitHubだけ見たら分かるようにしとこうよ」という声が聞こえますが・・・
あえてコメントを書きまくる!!

/**
 * @param var $var オブジェクトから配列にするデータ
 * @param int $count 関数を呼び出した回数
 * @return array toArray()を呼び出した結果データ
 **/
static function toArray($var, $count=0) {

	// オブジェクトじゃない場合は何もしないので戻り値にしまう
	$ret = $var;

        // 再起の最大呼び出し回数を超えていない時処理をする
	if( $count <= self::TO_ARRAY_LOOP_MAX ) {
		// toArray()が実装されているのなら
		if( self::methodExists($var,'toArray') ) {
                        // toArray()を再起にかける
			$ret = self::toArray($var->toArray(), $count+1);
		}else {
			// オブジェクトであってもstdClassの場合は配列にして返す
			if(is_object($var) && get_class($var) == 'stdClass'){
				$var = (array)$var;
			}

			// 配列の場合はそれぞれを再起させる
			if( is_array($var) ) {
				foreach($var as $key => $value) {
					$ret[$key] = self::toArray($value, $count+1);
				}
			} else {
				$ret = $var;
			}
		}
	}

	return $ret;
}

まとめ

class 定義時にtoArrayで変換できるようにしておいて
配列などのデータにまとまったデータを再帰的にtoArray()を呼び出して変換していきます。
countでreturnする処理は念のためです。

改善

クラス内の変数を取得する方法があった気がしますそれを使えばtoArray()がもう少し汎用的に作れそうです。

2
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
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?