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

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

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

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

Q&A

解決済

2回答

996閲覧

配列の連続している数を取得して格納したい

SakuBlade

総合スコア375

PHP

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

0グッド

0クリップ

投稿2018/02/23 05:52

編集2018/02/23 06:07

php

1$arrData = [ 2 ['row' => 0, 'price' => 4860], 3 ['row' => 0, 'price' => 4860], 4 ['row' => 0, 'price' => NULL], 5 ['row' => 0, 'price' => 3840], 6 ['row' => 0, 'price' => 3840], 7 ['row' => 0, 'price' => 4520], 8 ['row' => 0, 'price' => 3610], 9 ['row' => 0, 'price' => NULL], 10 ['row' => 0, 'price' => 3380] 11];

上記の配列の'price'が同じ値、またはNULLが連続している場合にその連続する数を'row'に格納したいです。
連続しているかの判断条件は同じ値、もしくはNULLです。

最終的には以下のようにしたいです。

php

1$arrData = [ 2 ['row' => 3, 'price' => 4860], 3 ['row' => 0, 'price' => 4860], 4 ['row' => 0, 'price' => NULL], 5 ['row' => 2, 'price' => 3840], 6 ['row' => 0, 'price' => 3840], 7 ['row' => 1, 'price' => 4520], 8 ['row' => 2, 'price' => 3610], 9 ['row' => 0, 'price' => NULL], 10 ['row' => 1, 'price' => 3380] 11];

foreachでループさせればいいのかと思ったのですが、望む結果が得られませんでした。

よろしくお願い致します。

追記:ソース

php

1foreach($arrData AS $key => $value) { 2 $row = 0; 3 foreach($arrData AS $key2 => $value2) { 4 if ($key >= $key2) continue; 5 if (is_null($value2['price']) || $value2['price'] == $value['price']) { 6 $row++; 7 } 8 } 9 $arrData[$key]['row']= $row; 10}

出力結果

php

1$arrData = [ 2 ['row' => 3, 'price' => 4860], 3 ['row' => 2, 'price' => 4860], 4 ['row' => 1, 'price' => NULL], 5 ['row' => 2, 'price' => 3840], 6 ['row' => 1, 'price' => 3840], 7 ['row' => 1, 'price' => 4520], 8 ['row' => 1, 'price' => 3610], 9 ['row' => 0, 'price' => NULL], 10 ['row' => 0, 'price' => 3380] 11];

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

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

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

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

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

m.ts10806

2018/02/23 05:54

望む結果を得られなかったソースコードをご提示願います。もしかしたらちょっと惜しいところまでいっていたかもしれませんし。失敗してもそれは成果には違いありません。
SakuBlade

2018/02/23 06:08

質問内容に追記しました。そもそもロジックの考え方が間違っているのかもしれません
guest

回答2

0

あら、ベストアンサー決まってしまった。
せっかく書いたので、参考までに載せておきます。

PHP

1$idx = 0; 2$befPrice = -1; 3foreach($arrData as $key => $value){ 4 if($befPrice !== $value['price'] && $value['price'] !== NULL){ 5 $idx = $key; 6 $befPrice = $value['price']; 7 } 8 $arrData[$idx]['row'] = $arrData[$idx]['row'] + 1; 9}

投稿2018/02/23 07:02

ttyp03

総合スコア16998

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

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

SakuBlade

2018/02/23 07:05

ありがとうございます。 foreach文の場合、大いに参考になります。
guest

0

ベストアンサー

冗長に処理するとこうですか?

PHP

1$arrData = [ 2 ['row' => 0, 'price' => 4860], 3 ['row' => 0, 'price' => 4860], 4 ['row' => 0, 'price' => NULL], 5 ['row' => 0, 'price' => 3840], 6 ['row' => 0, 'price' => 3840], 7 ['row' => 0, 'price' => 4520], 8 ['row' => 0, 'price' => 3610], 9 ['row' => 0, 'price' => NULL], 10 ['row' => 0, 'price' => 3380] 11]; 12 13for($i=0;$i<count($arrData);$i++){ 14 $count=1; 15 for($j=$i+1;$j<count($arrData);$j++){ 16 if($arrData[$i]["price"]===$arrData[$j]["price"] or 17 is_null($arrData[$j]["price"])){ 18 $count++; 19 continue; 20 }else{ 21 break; 22 } 23 } 24 $arrData[$i]["row"]=$count; 25 $i+=$count-1; 26} 27print_r($arrData);

NULLが連続したり、先頭のデータがNULLだったりしたときどうするのか
若干仕様が見えないところがあります

投稿2018/02/23 06:24

yambejp

総合スコア114833

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

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

SakuBlade

2018/02/23 06:28

説明不足で申し訳ありません。 NULLが連続した場合も前データが連続しているとみなします。 また、先頭データがNULLになる事は無く、常に値が格納されます。
SakuBlade

2018/02/23 06:33

ありがとうございます。 試したところ、望む結果が得られました。 あとはこれを解析して処理を理解して今後活かせるようにいたします。
yambejp

2018/02/23 06:34 編集

追記の条件であれば提示した内容で合致しているとおもいます 何かバグってたら追記して下さい
yambejp

2018/02/23 06:35

あと、nullの後ろにまた同じデータが出てきたときも考慮してみてください (いまのロジックだと連続データとして処理されます)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問