20201122のPHPに関する記事は9件です。

ボタンクリックにより、同じIDの別のカラムのフィールドを出力する

前提: DBが作成されデータが入っている状態

例えば、こんな感じのデータベースを用意して
image.png

キャラ名の隣のボタンをクリックすると
image.png

そのキャラのタイプが表示される。
image.png

(↓動画にするとこんな感じ)
https://gyazo.com/8e68421fe20af2d6b68093ba0108cc9f

みたいな実装をしたい場合は、以下のように書く。

index.php
// DB接続に必要な記述
$con = mysqli_connect('127.0.0.1', 'root', '');
$result = mysqli_select_db($con, 'データベース名');
$result = mysqli_query($con, 'SET NAMES utf8');
$result = mysqli_query($con, 'SELECT * FROM テーブル名');

while ($data = mysqli_fetch_array($result)) {
  print '<form method="post" action="next.php">';
  // next.phpに「id」というnameの「$data['ID']」というvalueが送られる
  print '<input type="hidden" name="id" value="'.$data['ID'].'">';
  // $data['']の中に表示させたいDBのカラム名を記載する
  print '<input type="hidden">' . $data['NAME'] ;
  print '<input type="submit" value="何の呼吸?">';
  print '</form>';
}
next.php
try
{
  // $_POST['']の中には、qiita_index.phpから受け取るname属性の値が入れる
  $kimetsu_id=$_POST['id'];

  // DBへ接続
  $dsn = 'mysql:dbname=yurutto;host=localhost;charset=utf8';
  $user='root';
  $password='';
  $dbh = new PDO($dsn, $user, $password);
  $dbh->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);

  $sql = 'SELECT TYPE FROM kimetsu WHERE ID = ?';
  $stmt = $dbh->prepare($sql);
  $data[]=$kimetsu_id;
  $stmt->execute($data);

  $rec = $stmt->fetch(PDO::FETCH_ASSOC);
  $kokyu_type=$rec['TYPE'];

  $dbh = null;

  //  同じIDのTYPEカラムのフィールドを出力する
  // (= submitボタンで選択したキャラのタイプが出力する)
  print $kokyu_type;

}
catch (Exception $e)
{
  print 'ただいま障害により大変ご迷惑をお掛けしております。';
  exit();
}
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

is_arrayについて

is_arrayとは

is_array() = ()の中の引数が変数か配列か判定する関数。
変数が配列の場合「true」、配列ではない場合「false」が返される。

$number = array( 1,2,3,4);  //array()で配列を作成

if(is_array($number) ){
  print '$numberは配列です。';  //true時の処理
} else{
  print '$numberは配列ではありません。'; //false時の処理
}

↓ //出力結果

$numberは配列です。

参考元はこちら
(https://www.php.net/manual/ja/function.is-array.php)
(https://php-beginner.com/function/var/is_array.html)

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Humhubのカスタムモジュールの作り方(既存モジュールの改造:Modelにフィールドを追加する)

はじめに

Humhubのカスタムモジュールの開発について、今回は、既存モデル(モジュールのDB(ActiveRecord))にフィールドを追加して利用するカスタマイズを紹介する。今回の参考例は、スペースのデフォルト言語プロパティを整えることを目的に、「Space」モジュールを直接改造するカスタマイズだ。

事前準備

事前準備としては、計画立案と方法の調査・確認・検討を行うべきだろう。

設計(構成の検討)

今回、”スペースのデフォルト言語”という設定項目にしたいので、既存のSpaceモジュールのアクセスするDBにフィールドを追加して扱えるようにしたい。追加するフィールド名をlanguageとし、文字列を扱えるデータ型にしておけばよいだろう。あとは、Spaceモジュールの動作をカスタマイズするかSpaceモジュールのModelsを通じて、ActiveRecordを扱う処理を作成する、という手順だ。

手法の調査

Humhubの公式説明によると、まずは、humhubのルートディレクトリでコマンドを実行する必要があるようだ。そして、 protected/humhub/migrations に作成された the resulting migration をyour modules migration folder にコピーして、 スキーマの設定を書き加えよ、と。スキーマの設定に当たっては、Yii2のMigrationGuideを読め、とある。

手法の確認

ActiveRecordで直接作用してくれるような仕組みはない。開発者が手を動かすしかないのだ。事前準備は特になく、コマンドを打ち込む心構え、コードを書き切る気構えが必要だ。・・・事前調査資料をよく読んで何をするか考えるしかないっすね。

手順の検討

以下の手順では、もしも作業中断してもシステム運用が停止しないように、念のため対応順序に配慮した。すなわち、DB側フィールドの作成、ActiveRecordのルール・コントローラ作成、フィールドの呼び出しのビュー(フロントエンド)の順で作成する。こうすれば、ユーザー側ではフロンドエンドが適用されるまで操作に影響を生じないはずだ。

作業実行

DBへのフィールド追加

マイグレーション(=the resulting migration)の名前を add_xxx_column_to_yyy_table の形式とした場合、ファイルの内容は、 必要となる addColumn と dropColumn を含めてくれる。(ちょっとだけ自動)
(https://www.yiiframework.com/doc/guide/2.0/ja/db-migrations#karamuwo-zhui-jiasuru)

php yii migrate/create add_language_column_to_space_table --fields=”language:vchar(5) DEFAULT NULL”
( ‘yes’ と答える )

mv /var/www/html/humhub/protected/humhub/migrations/m~~~~~_add_language_column_to_space.php /var/www/html/humhub/protected/humhub/modules/space/migrations/
( ~~~~~の部分は、作成日時によって異なる数字 )

php yii migrate/up --includeModuleMigrations=1
( Yii と humhub のバージョンの相性によってエラーが出ることがある。その場合は、エラーの指示に従って修正すること。)

DBにアクセスして、Spaceテーブルの構造を操作し、languageが加わったことを確認する。

名前 データ型 照合順序 NULL デフォルト値
language varchar(5) utf8mb4_unicode_ci はい NULL

MVCモデルの組み立て(Model: ActiveRecordルールの設定)

ActiveRecordにルールを設定するメリットについては、Yii2フレームワークの公式説明を読んでほしい。入力のバリデーションを行なってデータを適切に扱うことができるようにする仕組みだ。

/var/www/html/humhub/protected/humhub/modules/space/models/Space.php

  function rules() にlanguageを加える。
  130行目付近
    ['language', 'in', 'range' => array_keys(Yii::$app->i18n->getAllowedLanguages())],

  function scenarios() にLanguageを加える。
    $scenarios[static::SCENARIO_EDIT] = ['name', 'color', 'description', 'tags', 'join_policy', 'visibility', 'default_content_visibility', 'url', 'language'];
    $scenarios[static::SCENARIO_CREATE] = ['name', 'color', 'description', 'join_policy', 'visibility', 'default_content_visiblity', 'language'];

  function attributeLabels()にLanguageを加える。
    'language' => Yii::t('SpaceModule.base', 'Language')

※ humhubのinternationalization機能に即して、Yii::t()を用いている。上記コードブロックの最終行での ’Language’ が messages/ja/base.php に書き加えるキーになる。

MVCモデルの組み立て(Controller: Controllerの扱うデータにlanguageを加える)

/var/www/html/humhub/protected/humhub/modules
                              /space/modules/manage/controllers/DefaultController.php
function actionIndex() のreturn に、languageを加える。
   $languages = Yii::$app->i18n->getAllowedLanguages();
   $col = new \Collator(Yii::$app->language);
   $col->asort($languages);
   return $this->render('index', ['model' => $space, 'languages' => $languages]);

/var/www/html/humhub/protected/humhub/modules/space/controllers/CreateController.php
function actionCreate() に Language を加える。
終盤付近
   $languages = Yii::$app->i18n->getAllowedLanguages();
   $col = new \Collator(Yii::$app->language);
   $col->asort($languages);

   return $this->renderAjax('create', ['model' => $model, 'visibilityOptions' => $visibilityOptions, 'joinPolicyOptions' => $joinPolicyOptions, 'languages' => $languages]);

MVCモデルの組み立て(View: 表示部分)

/var/www/html/humhub/protected/humhub/modules/space/modules/manage/views/default/index.php
31行目付近  language 選択のdropDownListを加える。
  <?php if (count($languages) > 1) : ?>
    <?= $form->field($model, 'language')->dropDownList($languages, ['data-ui-select2' => '']); ?>
  <?php endif; ?>

internationalization処理対応

humhubのルートディレクトリで、次のコマンドを実行する。すると、モジュールのディレクトリの中にMessageフォルダが作成され、その中に各言語のリソースが作成されるhumhub公式説明。Internationalization]HumhubVer.1.6以降では、既存のリソースを上書きすることなく、必要に応じた追記処理をおこなってくれるようだ。しかし、この動作は保証されたものではないので、事前に必要なメッセージリソースのバックアップを取っておくことをオススメしたい。

php yii message/extract-module space

その後、リソースファイルを編集する。例えば、日本語メッセージリソースの編集は次のとおり。

/var/www/html/humhub/protected/humhub/modules/space/messages/ja/base.php
(ファイルを開き、配列の中から、'Language'キーを探して、対応する値を設定。)
   'Language' => '主な使用言語'

最後に、このlanguageデータを設定・編集する場所を作る。ただし、カスタムテーマを使用している場合は、当該テーマのViewに記載する必要がある。
humhubのdropDownListウィジェットを使用した記述を行なっている。詳細は別途、Qiita投稿することとしたい。

/var/www/html/humhub/protected/humhub/modules/space/views/create/create.php
25行目付近  language 選択のdropDownListを加える。
  <?php if (count($languages) > 1) : ?>
      <?= $form->field($model, 'language')->dropDownList($languages, ['data-ui-select2' => '']); ?>
  <?php endif; ?>

 動作確認

今回のカスタマイズ作業を完了すると、スペースを追加する操作において、次のように表示される。下段に、Languageのドロップダウンが表示されていることがわかるだろう。
スクリーンショット 2020-11-22 17.43.02.png

なお、日本語設定では、次のとおり。見出し部分が、日本語翻訳で表示されていることがわかる。
スクリーンショット 2020-11-22 17.53.05.png

スペースを実際に作成して、DBをのぞいてみれば、languageフィールドに設定した言語情報が記録されていることがわかるだろう。(DBのフィールド情報の確認画面は割愛。)

まとめ

今回は、既存Modelのカスタマイズの例として、プロパティを追加し、DB(ActiveRecord)にフィールドを追加して操作(新規追加)する例を取り上げた。あわせて、翻訳処理対応も解説したが、翻訳処理対応は今後も頻繁に出てくるので利用方法にはぜひ慣れておきたい。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Laravel:SQLSTATE[42000]: Syntax error or access violation...bytesの解決

【概要】

1.結論

2.SQLSTATE[42000]とは何か

3.なぜこのエラーになったのか

4.どのように解決したのか

5.参考URL

6.開発環境

1.結論

app/Providers/AppServiceProviderpublic function boot()Schema::defaultStringLength(191);を記載する!

2.SQLSTATE[42000]とは何か

アクセス違反ですという意味で、SQL文の文法に誤りがあるということです。ただ、それに起因してデータがパンパンになっているためこのエラーになっています。

3.なぜこのエラーになったのか

結論から言いますとLaravelとMysqlのバージョンのせいで、Mysqlのカラムや中身の文字列がデータ量(767bytesがMAX)を超えたからでした。UTF8MB4になり1文字あたりのデータ量(4bytes)が増えたからのようです。
(大変参考になったURLを下記(参考URL)に添付しています。)

4.どのように解決したのか

app/Providers/AppServiceProvider
use Illuminate\Support\Facades\Schema; //⬅︎を追加記載(❶)
use Illuminate\Support\ServiceProvider;

class AppServiceProvider extends ServiceProvider
{
// 省略
    public function boot()
    {
        Schema::defaultStringLength(191); //⬅︎を追加記載(❷)
    }
}

4bytes*191文字=764bytesに抑えることで、規定量以下にしました。これをデフォルト設定にしているのでどのテーブルにもこれが適用されます。Mysqlのバージョンアップもありましたが、手軽かつアプリを使用する際に100文字を超える実装はなかったので今回はこの手段を取りました。また❶を記載しないとエラーが起きます。

5.参考URL

①Laravel5.4以上、MySQL5.7.7未満 でusersテーブルのマイグレーションを実行すると Syntax error が発生する
②【Laravel】migrateでテーブルが存在したらスキップする

6.開発環境

PHP 7.4.10
Laravel 8.9.0
MySQL 5.6.47/SequelPro 1.1.2

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Laravel:SQLSTATE[42000]Syntax error or access violation...bytesの解決

【概要】

1.結論

2.SQLSTATE[42000]とは何か

3.なぜこのエラーになったのか

4.どのように解決したのか

5.参考URL

6.開発環境

1.結論

app/Providers/AppServiceProviderpublic function boot()Schema::defaultStringLength(191);を記載する!

2.SQLSTATE[42000]とは何か

アクセス違反ですという意味で、SQL文の文法に誤りがあるということです。ただ、それに起因してデータがパンパンになっているためこのエラーになっています。

3.なぜこのエラーになったのか

結論から言いますとLaravelとMysqlのバージョンのせいで、Mysqlのカラムや中身の文字列がデータ量(767bytesがMAX)を超えたからでした。UTF8MB4になり1文字あたりのデータ量(4bytes)が増えたからのようです。
(大変参考になったURLを下記(参考URL)に添付しています。)

4.どのように解決したのか

app/Providers/AppServiceProvider
use Illuminate\Support\Facades\Schema; //⬅︎を追加記載(❶)
use Illuminate\Support\ServiceProvider;

class AppServiceProvider extends ServiceProvider
{
// 省略
    public function boot()
    {
        Schema::defaultStringLength(191); //⬅︎を追加記載(❷)
    }
}

4bytes*191文字=764bytesに抑えることで、規定量以下にしました。これをデフォルト設定にしているのでどのテーブルにもこれが適用されます。Mysqlのバージョンアップもありましたが、手軽かつアプリを使用する際に100文字を超える実装はなかったので今回はこの手段を取りました。また❶を記載しないとエラーが起きます。

5.参考URL

①Laravel5.4以上、MySQL5.7.7未満 でusersテーブルのマイグレーションを実行すると Syntax error が発生する
②【Laravel】migrateでテーブルが存在したらスキップする

6.開発環境

PHP 7.4.10
Laravel 8.9.0
MySQL 5.6.47/SequelPro 1.1.2

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

PHP 少し凝った比較と計算ヽ(´▽`)/

初めに

比較
こんな時どうしよう、、、
こんな時どうしてたっけ?
みたいなことが10000億回ぐらいあるので、
ここに記録しておくことにしました!

普通の比較に関しては他の記事にた〜〜〜〜〜〜くさんあるかと思ったので、
『少し凝った比較と計算』と自分が思うものあげていきます!

記事は温かい目でみて頂けると嬉しいです!
優しい世界大事、大事ヽ(´▽`)/

ちなみに、コード実際にすぐ動かしたいだ!という方に以下オススメです!
私はよくお世話になってます!『paiza』さんありがとうございます!
https://paiza.io/ja/projects/new

in_array + array_map

:thinking:配列の中のあるキーの値の中に含まれているか確認したいんだ~~~~の時に使用

コード例

<?php
$user_article_id = 454556;

$stars = [
    0 => ['id' => 123424, 'article_id' => 454545],
    1 => ['id' => 198989, 'article_id' => 454556],
    2 => ['id' => 132323, 'article_id' => 454547]
];

// article_idの配列作成
$articleIds = array_map(fn($el) => ($el['article_id']), $stars);

//『articleIds』に『user_article_id』が含まれているかの確認
if(in_array($user_article_id, $articleIds)){
    echo '含まれている';
}else{
    echo '含まれていない';
}
//含まれている
?>

array_map + count + array_sum

:thinking:配列の中のあるキーの値の配列の合計数を出したいのどうすれば良いかな?

<?php
$stars = [
    0 => ['ids' => [123424, 343434], 'article_id' => 454545],
    1 => ['ids' => [198989, 545454], 'article_id' => 454556],
    2 => ['ids' => [132323, 767676, 87878], 'article_id' => 454547]
];

// 各idsの配列の合計を格納した配列の作成
$idCounts = array_map(fn($el) => count($el['ids']), $stars);

//上記の配列数を足す
$star_id_total =  array_sum($idCounts);

echo $star_id_total;
//7
?>

最後に

終わりです!
タイトル良いの思いつかなかったのが、、、、
また少し凝ったやつあったら書き足していく予定です!

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

PHP array_mapの色々活用方法

初めに

@tadsan さんに他の書き方教えていただいたので追記しています!
@tadsan さんありがとうございます!:bow:

比較
こんな時どうしよう、、、
こんな時どうしてたっけ?
みたいなことが10000億回ぐらいあるので、
ここに記録しておくことにしました!

記事は温かい目でみて頂けると嬉しいです!
優しい世界大事、大事ヽ(´▽`)/

ちなみに、コード実際にすぐ動かしたいだ!という方に以下オススメです!
私はよくお世話になってます!『paiza』さんありがとうございます!
https://paiza.io/ja/projects/new

in_array + array_map

:thinking:配列の中のあるキーの値の中に含まれているか確認したいんだ~~~~の時に使用

コード例

<?php
$user_article_id = 454556;

$stars = [
    0 => ['id' => 123424, 'article_id' => 454545],
    1 => ['id' => 198989, 'article_id' => 454556],
    2 => ['id' => 132323, 'article_id' => 454547]
];

// article_idの配列作成
$articleIds = array_map(fn($el) => ($el['article_id']), $stars);

//『articleIds』に『user_article_id』が含まれているかの確認
if(in_array($user_article_id, $articleIds)){
    echo '含まれている';
}else{
    echo '含まれていない';
}
//含まれている

上記を『array_column』を使って書くと以下になります!
@tadsan さんに教えていただきました!

<?php
$user_article_id = 454556;

$stars = [
    0 => ['id' => 123424, 'article_id' => 454545],
    1 => ['id' => 198989, 'article_id' => 454556],
    2 => ['id' => 132323, 'article_id' => 454547]
];

// array($article_id => $id) 配列作成
$articleIds = array_column($stars, 'id', 'article_id');

//『articleIds』に『user_article_id』が含まれているかの確認
if (isset($articleIds[$user_article_id])){
    echo '含まれている';
} else {
    echo '含まれていない';
}
//含まれている

array_map + count + array_sum

:thinking:配列の中のあるキーの値の配列の合計数を出したいのどうすれば良いかな?

<?php
$stars = [
    0 => ['ids' => [123424, 343434], 'article_id' => 454545],
    1 => ['ids' => [198989, 545454], 'article_id' => 454556],
    2 => ['ids' => [132323, 767676, 87878], 'article_id' => 454547]
];

// 各idsの配列の合計を格納した配列の作成
$idCounts = array_map(fn($el) => count($el['ids']), $stars);

//上記の配列数を足す
$star_id_total =  array_sum($idCounts);

echo $star_id_total; // => 7

上記を『array_reduce()』を使って書くと以下になります!
@tadsan さんに教えていただきました!

<?php
$stars = [
    0 => ['ids' => [123424, 343434], 'article_id' => 454545],
    1 => ['ids' => [198989, 545454], 'article_id' => 454556],
    2 => ['ids' => [132323, 767676, 87878], 'article_id' => 454547]
];

$star_id_total = array_reduce($stars, fn($sum, $el) => $sum + count($el['ids']));

var_dump($star_id_total); // => 7

ちなみにこれをforeachだけで書くとしたらのサンプルコード1

<?php
$stars = [
    0 => ['ids' => [123424, 343434], 'article_id' => 454545],
    1 => ['ids' => [198989, 545454], 'article_id' => 454556],
    2 => ['ids' => [132323, 767676, 87878], 'article_id' => 454547]
];
$count = 0;
foreach ($stars as $star){
    $ids = $star['ids'];
    foreach ($ids as $id){
        $count += 1;
    }
}
echo $count;  // => 7

ちなみにこれをforeachだけで書くとしたらのサンプルコード2

<?php
$stars = [
    0 => ['ids' => [123424, 343434], 'article_id' => 454545],
    1 => ['ids' => [198989, 545454], 'article_id' => 454556],
    2 => ['ids' => [132323, 767676, 87878], 'article_id' => 454547]
];
$count = 0;
foreach ($stars as $star){
    $idCount = count($star['ids']);
    $count += $idCount;
}
echo $count;  // => 7

最後に

終わりです!
また少し凝ったやつあったら書き足していく予定です!
ちなみに私はこの書き方が絶対だという感じのものはないです。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【PHP】PaizaのDランク問題(辞書式ソート)で躓いた話

はじめに

アルゴリズムの基礎を学ぶため、現在Paizaラーニングの問題集に取り組んでいます。こちらのリンク先の問題はCランク(forループなどの基礎的な問題が解ける程度の水準)達成に向けた問題集ですので基本的に難易度は低いはずですが、躓いた問題があったので投稿しておきます。

ソート問題 STEP:3 辞書式ソート

難易度は堂々のDランクです。ぐぬぬ。
PHPではソート用の関数としてsort()rsort()といった関数が用意されていますが、文字列の場合でもこれが適用できますよ、ということを初学者向けに紹介するというのがコンセプトとなった問題な気がします。気がするのですが・・・

問題概要

こちらから。
https://paiza.jp/works/mondai/c_rank_level_up_problems/c_rank_sort_step3?language_uid=php
ユーザー登録が必要ですが、問題は無料でチャレンジすることができます。

----入力例----
3
1 3
3 5
3 4

----出力例----
3 5
3 4
1 3

ざっくり問題を紹介しますと、まずはじめの入力値として整数nが与えられ、スペースで区切られたペアの数字列(a_b)が入力値分n個与えられます。

1.ふたつのペアの数が異なる場合、aの数が多い方が偉い(この際bは関係ない)
2.aが同じである場合、bが多い方が偉い

上記の条件を踏まえて、偉い順にソートして値を出力しましょうという問題です。

解いてみる

はじめに下記のようなコードで入力サンプルをクリア。

<?php
    //出力をループする回数
    $input_line = fgets(STDIN);

    //残り入力される分だけ配列$array[]に入れる
    while ($input = fgets(STDIN)) {
        $array[] = trim($input);
    }

    //関数で大きい順(降順)にソートする
    rsort($array);

    //改行して値を出力
    for ($i=0; $i < $input_line; $i++) {
        echo $array[$i]."\n";
    }

?>
----入力値----
3
3 5
1 3
3 4

----出力値----
3 5
3 4
1 3

しかしこのコードでは、以下のような入力の場合に上手くソートされておらずNG判定となりました。

----入力値----
7
10 5
1 3
2 1
20 10
3 4
20 1
20 5

----出力値----
3 4
20 5
20 10
20 1
2 1
10 5
1 3

入力した値に半角スペースが含まれているため文字列として格納されていますので、数字の3と20を比較した時に、初めの3と2が比較され、3の方が高い値であるとみなされてしまっています。

paiza公式(Python3の場合)の解説を見ると、「入力値を保持した配列をそのままソート関数に渡して降順に並べるだけで良い」と記載があります。PHPの解法は載っていなかったため別言語の解法を確認したのですが、あまり上手くいかず。どうしたものか・・・

1時間くらい悩みましたが、以下のステップを踏むことで解決しました。

1.入力値を配列に格納する
2.explode()関数で値を分割する
3.配列の値をsprintf()関数を用いて、書式を整える(1という値を01表記にする)
4.rsort()関数でソート(書式を整えて03とした値なら20と比較した場合でもソートできるはず)
5.explode()で再分割。sprintf()関数で元の書式に戻してやり、改めて配列に格納
6.整えた配列を出力

sprintf関数については、個人的にこちらのページが分かりやすかったです。
https://wp.tech-style.info/archives/582

最終的に以下のコードとなりました。

<?php

$inputNum = trim(fgets(STDIN));

//1.入力値を配列に格納する
while ($input = fgets(STDIN)) {
    $array[] = trim($input);
}

for ($i=0; $i<$inputNum; $i++) {
    //2.explode()関数で値を分割する
    $test = explode(" ", $array[$i]); 

    //3.配列の値をsprintf()関数を用いて、書式を整える(1という値を01表記にする)
    $test[0] = sprintf('%02d', $test[0]);
    $test[1] = sprintf('%02d', $test[1]);
    $sort_array[] = $test[0] . " " . $test[1];
}

//4.rsort()関数でソート
rsort($sort_array);

for ($i=0; $i<$inputNum; $i++) {
    //5.explodeで再分割。sprintfで元の書式に戻してやり、改めて配列に格納
    $answer = explode(" ", $sort_array[$i]);
    $answer[0] = sprintf('%01d', $answer[0]);
    $answer[1] = sprintf('%01d', $answer[1]);
    $answer_array[] = $answer[0] . " " . $answer[1];
}

//6.整えた配列を出力
for ($i=0; $i < $inputNum; $i++) {
    echo $answer_array[$i] . "\n";
}

?>

無事出力できました。

----入力値----
7
10 5
1 3
2 1
20 10
3 4
20 1
20 5

----出力値----
20 10
20 5
20 1
10 5
3 4
2 1
1 3

おわりに

冗長なコードである感じもありますが、備忘録も兼ねて記載させて頂きました。
まだまだ勉強不足ですので、PHPでももっと楽に出力させられるよ、こんな考え方でもソートできるよ、などの意見がありましたらご教示いただければとても嬉しいです。

閲覧ありがとうございました!

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【初心者】PHPでバブルソートを使ってみた。

バブルソート

何度も使うので覚えておいた方が良いのかもしれないので、チラシの裏な感じで。
バブルソートとは隣り合う要素の大小を比べながら小さい順(大きい順)に並べること。

for($i = 0, $i < n, $i++)
  for($j = 1, $j < n, $j++)
    $jx = $j - 1;
    if($jx > $j){
      $temp = $jx;
      $jx = $j;
      $j = $temp;
    }
  }
}

こんな雰囲気で、左隣が右隣より大きかったら、空の箱($temp)を用意して、一時的に避難させて、入れ替える。
大きい順に並べたかったら逆にすれば良いのだろうなという想像をしながら、今日の学びは終了。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む