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

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

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

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

Q&A

解決済

5回答

1823閲覧

先頭が同じ数値のものを一つの配列にまとめる

退会済みユーザー

退会済みユーザー

総合スコア0

PHP

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

0グッド

0クリップ

投稿2015/12/15 16:17

閲覧ありがとうございます。
数値の文字列があり、それを先頭が同じ数値のもの同士を一つの配列に整理して入れるということをやりたいと思っています。

HTML

1200#0#2500#200#0 2100#0#2500#200#0 3100#0#2500#200#0 4100#0#2500#200#0 5200#300##10000#400##5000 6200#0#2500#200#0 780#0#1000#100#0

このような文字列がテキストエリア内から送信され、
取得して計算し、結果を返すという処理です。

途中までできたのですが、先頭が同じ数値のものをまとめられず、その先の処理に進めない状態です。
まずは、一行ずつ配列に格納しています。

PHP

1print_r($hoge); 2Array 3( 4 [0] => 200#0#2500#200#0 5 [1] => 100#0#2500#200#0 6 [2] => 100#0#2500#200#0 7 [3] => 100#0#2500#200#0 8 [4] => 200#300##10000#400##5000 9 [5] => 200#0#2500#200#0 10 [6] => 80#0#1000#100#0 11) 12 13$hoge_list = array(); 14$nowValue = -1; 15$nowIndex = -1; 16foreach($hoge as $data) { 17 if(preg_match('/^\d+/' , $data , $match) !== 1) { 18 exit(1); 19 } 20 if($match[0] <> $nowValue) { 21 $nowValue = $match[0]; 22 $nowIndex++; 23 } 24 $hoge_list[$nowIndex][] = $data; 25} 26print_r($hoge_list); 27 28Array 29( 30 [0] => Array 31 ( 32 [0] => 200#0#2500#200#0 33 ) 34 [1] => Array 35 ( 36 [0] => 100#0#2500#200#0 37 [1] => 100#0#2500#200#0 38 [2] => 100#0#2500#200#0 39 ) 40 [2] => Array 41 ( 42 [0] => 200#300##10000#400##5000 43 [1] => 200#0#2500#200#0 44 ) 45 [3] => Array 46 ( 47 [0] => 80#0#1000#100#0 48 ) 49)

こういった形で、同じ数値の記述が連続して書かれていないと、うまく取得できていないようです。

今回だと、「200#0#2500#200#0」の数値が独立してしまっています。。

結果として、以下のような結果を期待しています。

HTML

1Array 2( 3 [0] => Array 4 ( 5 [0] => 80#0#1000#100#0 6 ) 7 [1] => Array 8 ( 9 [0] => 100#0#2500#200#0 10 [1] => 100#0#2500#200#0 11 [2] => 100#0#2500#200#0 12 ) 13 [2] => Array 14 ( 15 [0] => 200#0#2500#200#0 16 [1] => 200#300##10000#400##5000 17 [2] => 200#0#2500#200#0 18 ) 19)

独立していた「200#0#2500#200#0」がきちんと、200から始まる行なので、配列に入っています。

ご教授頂けますと幸いです。
宜しくお願い致します。

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

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

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

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

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

guest

回答5

0

少し出力形式が変わってしまいますが、

PHP

1 $hoge_list[$nowIndex][] = $data;

PHP

1 $hoge_list[$nowIndex][$match[0]] = $data;

として、出力先の配列のインデックスに先頭の値を使うというのは如何でしょうか。

それが許されないのであれば、その後出力された配列をソートしてからインデックスを差し替えれば想定通りの形に出来ます。

投稿2015/12/16 05:44

tanat

総合スコア18713

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

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

0

以下でどうでしょう。

php

1$input = [ 2 '200#0#2500#200#0', 3 '100#0#2500#200#0', 4 '100#0#2500#200#0', 5 '100#0#2500#200#0', 6 '200#300##10000#400##5000', 7 '200#0#2500#200#0', 8 '80#0#1000#100#0' 9]; 10$result = []; 11foreach($input as $key => $value) { 12 $result[intval($value)][] = $value; // ※ 13} 14ksort($result); // キーの順番を 80 100 200 にする 15$result = array_merge($result); // 80 100 200 を 0 1 2 にして通常の配列にする

intval('200#0#2500#200#0') は 200 を返します。数値として解釈できるところまでを数値にします。
$未定義[] = $value; で、勝手に配列が作られます。
使い所に要注意な危険仕様ですが、$result = []の直後なのでここでは安全です。

投稿2015/12/16 05:37

tozjp

総合スコア790

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

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

0

ベストアンサー

こんな感じでいかがでしょうか。

PHP

1<?php 2 3$hoge = array( 4 '200#0#2500#200#0', 5 '100#0#2500#200#0', 6 '100#0#2500#200#0', 7 '100#0#2500#200#0', 8 '200#300##10000#400##5000', 9 '200#0#2500#200#0', 10 '80#0#1000#100#0' 11); 12 13print_r($hoge); 14 15$hoge_list = array(); 16foreach ($hoge as $data) { 17 if (preg_match('/^\d+/' , $data , $match) !== 1) { 18 exit(1); 19 } 20 $key = $match[0]; 21 if (!isset($hoge_list[$key])) { 22 $hoge_list[$key] = array(); 23 } 24 $hoge_list[$key][] = $data; 25} 26ksort($hoge_list); 27$hoge_list = array_values($hoge_list); 28 29print_r($hoge_list);

投稿2015/12/16 01:39

hyper-drums-ko

総合スコア736

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

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

退会済みユーザー

退会済みユーザー

2015/12/16 05:55

ありがとうございます。 こちらを参考に書いたコードに改変をしたらうまくいきました! また、こちらで質問になるのですが、 $hogeという配列に、「###」という数値以外の文字列があった場合に配列から削除したいのですが、unsetを使うのがいいんでしょうか?
hyper-drums-ko

2015/12/16 06:54

unsetは連想配列のキーを基に削除を行いますので ```PHP for ($i = 0; $i < count($hoge); $i++) { if (strpos($hoge[$i], '###') !== false) { unset($hoge[$i]); } } $hoge = array_values($hoge); ``` もしくは array_filter を使って ```PHP $hoge = array_filter( $hoge, function($value) { return strpos($hoge[$i], '###') === false; } ); ``` でしょうか。
guest

0

先頭の値をgerpで探索したほうが良い気もします。

php

1<?php 2 3$hoge = [ 4 '200#0#2500#200#0', 5 '100#0#2500#200#0', 6 '100#0#2500#200#0', 7 '100#0#2500#200#0', 8 '200#300##10000#400##5000', 9 '200#0#2500#200#0', 10 '80#0#1000#100#0' 11]; 12 13$hoge_list = []; 14$temp_array = []; 15$index_list = []; // 探索済み数値リスト 16 17foreach ($hoge as $data) { 18 # 先頭の数値切り出し 19 if (preg_match('/^\d+/', $data, $match) !== 1) { 20 exit(1); 21 } 22 23 # 切り出した数値はすでに探索済みか? 24 if (in_array($match[0], $index_list)) { 25 continue; 26 } 27 28 # 同じ数値を先頭に持つ要素を探す。 29 $temp_array = preg_grep("/^$match[0]/", $hoge); 30 31 # 添字を振りなおして格納 32 $hoge_list[] = array_merge($temp_array); 33 34 # 数値を探索済みリストに入れる 35 $index_list[] = $match[0]; 36 37} 38 39var_dump($hoge_list);

投稿2015/12/16 00:32

Kaoru_A

総合スコア124

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

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

退会済みユーザー

退会済みユーザー

2015/12/16 05:53

ご回答ありがとうございます。 丁寧にコメントアウトで解説もいただき感謝します。
guest

0

順番に並んでいたら動作する状態でしたら、ソートしてから処理にかけるのはどうでしょうか?

PHP

1function cmp($a, $b) 2{ // 先頭から"#"までの文字列を切り出して、それを数値変換し比較する。数値化できない場合はゼロ 3 $tmpa = intval(substr($a,0,strpos($a,"#"))); 4 $tmpb = intval(substr($b,0,strpos($b,"#"))); 5 return ($tmpa == $tmpb) ? 0 : ($tmpa < $tmpb) ? -1 : 1; 6} 7usort($hoge, "cmp"); 8var_dump($hoge); 9/* 10array(7) { 11 [0]=> 12 string(15) "80#0#1000#100#0" 13 [1]=> 14 string(16) "100#0#2500#200#0" 15 [2]=> 16 string(16) "100#0#2500#200#0" 17 [3]=> 18 string(16) "100#0#2500#200#0" 19 [4]=> 20 string(16) "200#0#2500#200#0" 21 [5]=> 22 string(24) "200#300##10000#400##5000" 23 [6]=> 24 string(16) "200#0#2500#200#0" 25}*/

usortリファレンス

ソート時と分類時の2回文字列の分析をするので無駄ではありますが……

投稿2015/12/15 17:01

編集2015/12/15 17:21
hirohiro

総合スコア2068

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

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

退会済みユーザー

退会済みユーザー

2015/12/16 05:52

ご回答ありがとうございます。 usortという関数初めて知りました。 引き続き勉強してみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問