質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

アルゴリズム

アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。

Q&A

解決済

4回答

391閲覧

php 独自のルールを基に配列の並び替えを行いたい。

earnest_gay

総合スコア615

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

アルゴリズム

アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。

0グッド

0クリップ

投稿2018/06/24 16:58

編集2018/06/24 17:28

自作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; }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2018/06/25 01:29

「自作FW的なもの」と「wordpress」はどのような関係性なのでしょうか。
earnest_gay

2018/06/25 12:23

リリースまで乞うご期待!!!
m.ts10806

2018/06/25 12:59

あいえ。申し訳ないけどそういう興味はないので。
guest

回答4

0

条件だけ見ると「Admin か Front」を含むファイルを、配列の最後にもっていくだけで良い気がします。

投稿2018/06/24 21:14

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ちょっとぶち壊しな提案をしちゃいますが、
もしクラスの依存関係云々で読み込みの順番を調整したいってことなら
単純にspl_autoload_registerを使用することを提案します

autoload_functionで管理画面であるか否かによって
読みこむファイルを切り替えれば、
フロントと管理画面で使うクラスを切り替えることも簡単でしょう

投稿2018/06/25 05:34

KazuhiroHatano

総合スコア7804

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

私もタイトルだけ見て、usortだなと思って↓みたいのを書いてみました。

php

1<?php 2$list = [ 3 "/core/classes/controller/base/baseAdminController.php", 4 "/core/classes/controller/base/baseController.php", 5 "/core/classes/model/baseModel.php", 6 "/core/classes/object/baseObject.php", 7 "/core/classes/repository/baseRepository.php", 8]; 9 10usort($list, function (string $a, string $b) { 11 $fnameA = strtolower(basename($a)); 12 $fnameB = strtolower(basename($b)); 13 $priorA = (strpos($fnameA, "base") !== false && (strpos($fnameA, "admin") !== false || strpos($fnameA, "front") !== false)) ? -1 : 0; 14 $priorB = (strpos($fnameB, "base") !== false && (strpos($fnameB, "admin") !== false || strpos($fnameB, "front") !== false)) ? -1 : 0; 15 if($priorA === $priorB) { return $fnameA - $fnameB; } 16 return ($priorA > $priorB) ? -1 : 1; 17}); 18var_export($list); 19/* 20array ( 21 0 => '/core/classes/model/baseModel.php', 22 1 => '/core/classes/controller/base/baseController.php', 23 2 => '/core/classes/object/baseObject.php', 24 3 => '/core/classes/repository/baseRepository.php', 25 4 => '/core/classes/controller/base/baseAdminController.php', 26) 27*/

無名関数のところを適宜かえていけば、まあ色々とやれるのではないかとは思います。

ただ、フレームワークを意図しているのだとしたら、ファイル名もそうですが、ディレクトリの階層とかで制御したほうがいいようにも思いました。

投稿2018/06/25 02:03

papinianus

総合スコア12705

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

earnest_gay

2018/06/25 12:26

質問に合わせたサンプルがあって非常に良い回答であるといえます。 ありがとございます。
guest

0

リストからふたつを取り出して比較、前にあるか後ろにあるかを判別するだけで良い場合

PHP

1function cmp($a, $b) { 2 //条件 3} 4usort($fullPathFiles,"cmp");

PHP: usort - Manual

比較結果が等しくなる二つの要素があった場合、ソートした配列におけるそれらの並び順は不定となります。

とあるので、順番を極力維持したままソートしたい場合はforeach等を使う必要があります。

恐らくusortで事足りると思うので簡単な説明に留めますが、
for i=0 リストの0番目から最後まで
for j=i+1 リストのi+1番目から最後まで(i+1が範囲を超える時は実行しない)
// iよりもjの方を前に置きたい時は入れ替え
とすることで順番を維持したままソートは出来ます。

投稿2018/06/24 17:57

編集2018/06/24 18:00
efcode

総合スコア422

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

earnest_gay

2018/06/24 18:26

以下のindex 0と1を入れ替えたい場合はどうなりますか? [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
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問