自作FW的なものを作っているのですが、ファイルの読み込み順に問題があり、配列の順番を変えたいのですが、これになかなか苦戦しています。
2018-06-25 00:40:22: array(5) Array ( [0] => /core/classes/controller/base/baseAdminController.php [1] => /core/classes/controller/base/baseController.php [2] => /core/classes/model/baseModel.php [3] => /core/classes/object/baseObject.php [4] => /core/classes/repository/baseRepository.php )
ファイルの命名ルールを決めていて、以下になります。
- 管理画面で使うcontrollerの親classのファイル名は、adminとbaseという文字列が入ってなければなりません。
- フロント画面で使うcontrollerの親classのファイル名は、frontとbaseという文字列が入ってなければなりません。
- 親classの親class(基底class)のファイル名は、baseという文字列が入ってなければなりません。
手動なら問題ないんですが、scandir関数で指定したディレクトリ配下のファイルを取得する関数を作ってファイル取ってきているので、上記の形式で先にbaseAdminController.phpがくるんですね。
baseAdminController.phpはbaseController.phpを継承しているのでforeachでincludeするとbaseControllerは存在しないってエラーがでるんですね。
その措置として、上記ファイル配列の順番を変更する必要があります。
wordpressなんですけど、is_adminで管理画面じゃなければbaseAdminController.phpじゃなくてbaseFrontController.phpを取得してきます。
人間がわかるように説明すると、
ファイル名に((Admin か Front) と Base)を含んでいるファイルは、
ファイル名に(Admin か Front)を含まずBaseを含んでいるファイルよりも先に存在してはいけない。
です。
単なるsortではなく、システム固有のルールがあるのでそんな関数はないので自作しないとってところなんですが、このロジックが思い浮かばずです。
条件はわかっているのですが、単に「いるファイル、いらないファイル」なら条件に応じてcontinue
と$files[] = $crrentFile
でいいのですが、並び替えなのでちょっと苦戦しています。詰めるところをどうするかです。
とりあえず書いていったらifififififとかなりそうで相談がてら投稿しました。
以下、作りかけです。
php
1 /* 2 * 親classを継承しているclassファイルが先に読み込まれないように配列の順番を変更する。 3 * 4 * @param array $fullPathFiles 5 * 6 * @return array 7 */ 8 public static function changingTheOrderOfCoreFiles($fullPathFiles) 9 { 10 if (!is_array($fullPathFiles)) { 11 return false; 12 } 13 $getFiles = array(); 14 $loopCount = 0; 15 $previousIndexName = ''; 16 foreach ($fullPathFiles as $index => $fullPathFile) { 17 18 if (!$loopCount) { 19 continue; 20 } 21 22 // 前回のファイル名。 23 $previousFileName = mb_strtolower(self::getFileName($fullPathFiles[$previousIndexName])); 24 // 現在のファイル名。 25 $currentFileName = mb_strtolower(self::getFileName($fullPathFile)); 26 27 28 // 前回のファイル名に'Front or Admin' と 'Base'が含まれているか? 29 if ( 30 (strpos($previousFileName, mb_strtolower(self::FRONT_IDENTIFIER)) !== false || 31 strpos($previousFileName, mb_strtolower(self::ADMIN_IDENTIFIER)) !== false 32 ) 33 && strpos($previousFileName, mb_strtolower(self::BASE_IDENTIFIER)) !== false 34 ) { 35 36 // 現在のファイル名に'Front or Admin' と 'Base'が含まれているか? 37 if ( 38 (strpos($currentFileName, mb_strtolower(self::FRONT_IDENTIFIER)) !== false || 39 strpos($currentFileName, mb_strtolower(self::ADMIN_IDENTIFIER)) !== false 40 ) 41 && strpos($currentFileName, mb_strtolower(self::BASE_IDENTIFIER)) !== false 42 ) { 43 44 45 46 } 47 48 49 } 50 51 ++$loopCount; 52 $previousIndexName = $index; 53 } 54 return $getFiles; 55 }
ちょっとだけ近づいてきたけどこれじゃ無限ループになってしまう。。。
プロパティーにflag的なものは持たせたくない。
public static function changingTheOrderOfCoreFiles($fullPathFiles) { $getFiles = array(); foreach ($fullPathFiles as $fullPathFile) { $fileName = mb_strtolower(self::getFileName($fullPathFile)); // ファイル名に'Front or Admin' が含まれておらず、 'Base'は含まれているか? if ( (strpos($fileName, mb_strtolower(self::FRONT_IDENTIFIER)) === false || strpos($fileName, mb_strtolower(self::ADMIN_IDENTIFIER)) === false ) && strpos($fileName, mb_strtolower(self::BASE_IDENTIFIER)) !== false ) { $getFiles[] = $fullPathFile; } // ファイル名に'Front or Admin' が含まれいて、 'Base'も含まれているか? if ( (strpos($fileName, mb_strtolower(self::FRONT_IDENTIFIER)) !== false || strpos($fileName, mb_strtolower(self::ADMIN_IDENTIFIER)) !== false ) && strpos($fileName, mb_strtolower(self::BASE_IDENTIFIER)) !== false ) { $getFiles = array_merge($getFiles, self::changingTheOrderOfCoreFiles(array($fullPathFile))); } } return $getFiles; }
回答4件
あなたの回答
tips
プレビュー