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

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

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

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

Q&A

解決済

3回答

6963閲覧

PHPで値が続いている配列かどうかを判定したい

shiro96

総合スコア21

PHP

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

0グッド

0クリップ

投稿2017/05/05 09:49

###前提・実現したいこと PHP5
var_dump = $hoge;
array(5) { [0]=> int(1) [1]=> int(2) [2]=> int(3) [3]=> int(4) [4]=> int(5) }
array(5) { [0]=> int(3) [1]=> int(4) [2]=> int(5) [3]=> int(6) [4]=> int(7) }
いくつかある配列の中から、このように値が1,2,3,4,5や2,3,4,5,6と連続している配列を判定したいです。

中には3,6,7,8,9と続いていないものもあります。(4つ続いていたらそれはそれで判定したい)

こういったことは可能なのでしょうか?

いくつかarrayの関数をみたのですが、そのような操作に対応する関数がないように見えて、困っています。

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

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

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

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

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

shiroyuki

2017/05/05 10:21

検索対象の配列の長さは固定ですか?それとも可変長でしょうか?
shiro96

2017/05/05 10:28

可変ですが、すべての配列に1~15の間でランダムで5つずつ数字が入っています。
guest

回答3

0

ベストアンサー

  • 配列要素はすべて整数
  • 配列要素数は必ず1以上

という制約があれば,以下のようなシンプルな関数でチェックできます。

php

1function is_continuous_array(array $array) 2{ 3 return range($array[0], $array[0] + count($array) - 1) === $array; 4} 5 6var_dump(is_continuous_array([1, 2, 3, 4, 5])); // bool(true) 7var_dump(is_continuous_array([5, 6, 7, 9, 10])); // bool(false)

もうちょっと厳密に判定するように書くと

php

1function is_continuous_array(array $array) 2{ 3 return $array // 要素が1つ以上あるか 4 && array_filter($array, 'is_int') === $array // 整数以外のものを含んでいないか 5 && is_array(json_decode(json_encode($array))) // キーが0からの整数連番で連続しているか 6 && range($array[0], $array[0] + count($array) - 1) === $array; // 値が整数連番で連続しているか 7} 8 9var_dump(is_continuous_array([1, 2, 3, 4, 5])); // bool(true) 10var_dump(is_continuous_array([5, 6, 7, 9, 10])); // bool(false) 11var_dump(is_continuous_array([1, 2, [3], 4, 5])); // bool(false) 12var_dump(is_continuous_array([3 => 1, 2, 3, 4, 5])); // bool(false) 13var_dump(is_continuous_array([])); // bool(false) 14var_dump(is_continuous_array([3])); // bool(true) ←これってfalseのほうがいい?

投稿2017/05/05 10:39

編集2017/05/05 10:48
mpyw

総合スコア5223

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

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

mpyw

2017/05/05 10:52

もしソートしたほうが良ければ最初にsort関数によるソート処理を入れてください。この場合json_encodeを利用したキーのチェックは無意味になります(全部ゼロからの振り直しになるため)
shiro96

2017/05/05 11:00

ありがとうございます。rangeの使い方、理解することが出来ました。感謝です!
guest

0

自分で作ったらいいんじゃないでしょうか?
ランダムらしいのでソートしてから考えるようにしました。

php

1function renzoku($arr) { 2 sort($arr); 3 $l = count($arr); 4 for ($i = 1; $i < $l; $i++) { 5 if (($arr[$i-1]+1) != $arr[$i]) { 6 return false; 7 } 8 } 9 return true; 10} 11 12$a = [5,3,4,2,1]; 13$b = [5,6,9,7,10]; 14 15var_dump(renzoku($a)); 16// bool(true) 17var_dump(renzoku($b)); 18// bool(false) 19```mpywさんの方がかっこいい。rangeを使って配列を作って比較かぁ・・・ 20そういう思考が出来ないんだよなぁ・・・

投稿2017/05/05 10:27

編集2017/05/05 10:45
shi_ue

総合スコア4437

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

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

shiro96

2017/05/05 11:00

ありがとうございます。こういう関数を書く思考が出来ずいつもつまってしまいます。自分でも書けるように精進していきます!
guest

0

大抵の配列に対する欲求を満たす関数は揃っているのですが、ちょっと複雑な場合はarray_reduceを使います。

ちょっとPHPの環境が無いので適当ですが、例えばこんな感じになるかと思います

$result = array_reduce($hoge, function($c, $i) { static $cnt = 0,$current = null; if (is_null($current)) { //最初の値の場合 } elseif ($current + 1 == $i) { //連続していた $cnt++; } else { //連続が途切れた && $cntが2以上の場合 if ($cnt >= 2 && $cnt > $c) { //題意が不明だったが、連続が大きい方を残した $c = $cnt; } //カウンターを初期化 $cnt = 0; } $current = $i; return $c; }, 0 );

投稿2017/05/05 11:16

yoorwm

総合スコア1305

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問