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

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

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

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

Q&A

解決済

1回答

237閲覧

整数配列を範囲形式の文字列に変換したい

nitakaho

総合スコア14

PHP

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

0グッド

0クリップ

投稿2017/07/29 01:21

下記のような整数配列を範囲形式の文字列に変換したいです。

php

1//例 2$int_array = array(1, 4, 5, 6, 10, 18, 19, 20, 22); 3echo intArray2RangeString($int_array); 4//結果 : 1,4-6,10,18-20,22

自作でこのような関数を作成しました。

php

1function intArray2RangeString($int_array) 2{ 3 if (count($int_array) == 0) { 4 return ""; 5 } 6 7 //返り値 8 $result = $int_array[0]; 9 //範囲開始値 10 $range_start_num = $int_array[0]; 11 //前回ループ値 12 $prev_num = $int_array[0]; 13 for ($i = 1; $i < count($int_array); $i++) { 14 if ($prev_num + 1 == $int_array[$i]) { 15 if ($i + 1 == count($int_array)) { 16 $result = "{$result}-{$int_array[$i]}"; 17 } 18 } else { 19 if ($range_start_num != $prev_num) { 20 $result = "{$result}-{$prev_num},{$int_array[$i]}"; 21 } else { 22 $result = "{$result},{$int_array[$i]}"; 23 } 24 $range_start_num = $int_array[$i]; 25 } 26 $prev_num = $int_array[$i]; 27 } 28 return $result; 29}

そもそもPHPにはこのような関数が存在しますでしょうか。(都合上、バージョンはPHP5.2です。)
また、より簡潔に記述できる方法がありましたら、アドバイスを頂ければと思います。

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

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

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

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

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

guest

回答1

0

ベストアンサー

そもそもPHPにはこのような関数が存在しますでしょうか

私が知る限りでは、存在しません。

より簡潔に記述できる方法がありましたら、アドバイスを頂ければ

私が見た限りでは、特に問題ないと思います。

想定する入力 (array(1, 4, 5, 6, 10, 18, 19, 20, 22))に対して意図する結果を返しており、
特に冗長なロジックでもないと感じます。


それよりも、以下のような入力について

  • そのような入力があり得ることを想定する必要があるか?
  • 必要がある場合、どのような結果を返すべきか?

を検討してみることをおすすめします。

  • array(1, 3, 4, 6)のように、2回だけ連続する値

3,4と表示すべきか、3-4と表示すべきか?)

  • $int_arrayが null や配列以外の型の場合
  • array(1, 2, 2, 3)のように、重複する値が含まれている場合
  • array(1, 3, 2, 4)のように、値が昇順に並んでいない場合
  • array(1, null, '3', 4.5, new Object())のように、null や int型以外の値が含まれている場合

このように微妙なケースやエラーケースをどれだけ事前に予測できるかも、
(バグの少ない、という意味で)良いプログラムを書くコツの一つになります。

投稿2017/07/29 07:23

KiyoshiMotoki

総合スコア4791

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

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

nitakaho

2017/07/30 12:33

ご回答ありがとうございます! やっぱりデフォルトでの関数はないんですね。。 ちなみに目的は、wordとかPDFとかで特定条件に当てはまるページを自動的に印刷指定する、みたいな感じです。 ただ、ユーザの確認を必要とする場合を想定し、人の目で確認しやすい形式とする事が目的です。 重複や昇順、入力エラーなども考慮検討していましたが、入力が飽くまで自動であることを前提としていたため、今回のソースには含めませんでした。 ともあれ、わざわざコードレビュー頂いたことに、大変感謝しております!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問