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

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

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

for文は、様々なプログラミング言語で使われている制御構造です。for文に定義している条件から外れるまで、for文内の命令文を繰り返し実行します。

foreach

foreachは、List・Collection・Arrayといったデータ構造の各要素に対して繰り返し処理を実行するために扱われる、制御構造の構文です。

PHP

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

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

解決済

2回答

2220閲覧

一番初めに検知された値のみ格納させたい

Chelsea_10

総合スコア46

for

for文は、様々なプログラミング言語で使われている制御構造です。for文に定義している条件から外れるまで、for文内の命令文を繰り返し実行します。

foreach

foreachは、List・Collection・Arrayといったデータ構造の各要素に対して繰り返し処理を実行するために扱われる、制御構造の構文です。

PHP

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

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

1グッド

1クリップ

投稿2016/06/13 02:22

編集2016/06/13 03:45

お世話になります。

php

1//ドメイン 2$domainList = array("sample.jp","sample.co.jp",sample.com"); 3 4//URL sample.co.jp は該当しない 他は2つずつ検知されるようになっている。 5 6$urlList = array("http://sample.jp/aaa.html,sample.jpのサイトタイトル1","http://sample.com/aaa.html,sample.comのサイトタイトル1","http://sample.org/aaa.html,sample.orgのサイトタイトル1","http://sample.jp/bbb.html,sample.jpのサイトタイトル2","sample.com/bbb.html,sample.comのサイトタイトル2");

上記配列で
sample.jp,sample.comのみ2件検知されるような配列となっております。

これを一番初めに検知されたもののみ
URLでカンマ区切りされているURLとサイトタイトルを連想配列(一致しないドメインに関しては該当なし)にして格納したいのですがどのようにすればよろしいでしょうか?

下記が現状のコードになっております・・・

php

1$getInfo = array(); 2for($i=0;$i<=2;$i++) { 3 foreach( $urlList as $key => $url ) { 4 if(preg_match('{'.preg_quote("{$domainList[$i]}").'}i',$url,$match) === 1) { 5 6 //キーワード検索結果の分類 →カンマで句切られているため 7 $explodeUrlList = explode( ',', $url); 8 $getInfo['url'] = $explodeUrlList[0]; 9 $getInfo['title'] = $explodeUrlList[1]; 10 break; 11 } else { 12 $getInfo['url'] = "該当なし"; 13 $getInfo['title'] = "該当なし"; 14 } 15 } 16}

下記のように上書きされてしまっている状態です。
ご教授いただけますと助かります。

php

1var_dump($getInfo); 2array(2) { ["url"]=> string(12) "該当なし" ["title"]=> string(12) "該当なし" } array(2) { ["url"]=> string(12) "該当なし" ["title"]=> string(12) "該当なし" }

また、sample.co.jpは$urlListに格納されていないのですが
その場合

php

1//理想 2$getInfo['url'] =array("http://sample.jp/aaa.html","該当なし","http://sample.com/aaa.html"); 3$getInfo['title'] =array("sample.jpのサイトタイトル1","該当なし",sample.comのサイトタイトル1");

となるようにしたいのですがどうすればいいでしょうか。
重ね重ね申し訳ございません。
ご教授いただけますと助かります。

KiyoshiMotoki👍を押しています

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

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

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

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

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

mpyw

2016/06/13 03:47

そもそもフォーマットとしてこれどうなんでしょうか?「,」がURLとサイトタイトルの中に含まれない保証はありますか?
Chelsea_10

2016/06/13 03:49

こちらURLとカンマが分けられるようになっておりますので、絶対に,はつきます。 宜しくお願いします(_ _)
guest

回答2

0

ベストアンサー

php

1<?php 2//ドメイン 3$domainList = array("sample.jp","sample.co.jp","sample.com"); 4 5//URL sample.co.jp は該当しない 他は2つずつ検知されるようになっている。 6$urlList = array("http://sample.jp/aaa.html,sample.jpのサイトタイトル1","http://sample.com/aaa.html,sample.comのサイトタイトル1","http://sample.org/aaa.html,sample.orgのサイトタイトル1","http://sample.jp/bbb.html,sample.jpのサイトタイトル2","sample.com/bbb.html,sample.comのサイトタイトル2"); 7 8$getInfo = array(); 9foreach ($domainList as $domain) { 10 11 $found = FALSE; 12 foreach ($urlList as $url) { 13 if (strpos($url, $domain) !== FALSE) { // preg_matchは不要。strposで十分 14 15 //キーワード検索結果の分類 →カンマで句切られているため 16 $explodeUrlList = explode(',', $url); 17 $getInfo['url'][] = $explodeUrlList[0]; 18 $getInfo['title'][] = $explodeUrlList[1]; 19 20 $found = TRUE; 21 break; 22 } 23 } 24 25 if (!$found) { 26 $getInfo['url'][] = '該当なし'; 27 $getInfo['title'][] = '該当なし'; 28 } 29} 30 31print_r($getInfo);

実行結果

Array ( [url] => Array ( [0] => http://sample.jp/aaa.html [1] => 該当なし [2] => http://sample.com/aaa.html ) [title] => Array ( [0] => sample.jpのサイトタイトル1 [1] => 該当なし [2] => sample.comのサイトタイトル1 ) )

何回目のforeachでうまくいったかをカウントする方法

php

1<?php 2//ドメイン 3$domainList = array("sample.jp","sample.co.jp","sample.com"); 4 5//URL sample.co.jp は該当しない 他は2つずつ検知されるようになっている。 6$urlList = array("http://sample.jp/aaa.html,sample.jpのサイトタイトル1","http://sample.com/aaa.html,sample.comのサイトタイトル1","http://sample.org/aaa.html,sample.orgのサイトタイトル1","http://sample.jp/bbb.html,sample.jpのサイトタイトル2","sample.com/bbb.html,sample.comのサイトタイトル2"); 7 8$getInfo = array(); 9foreach ($domainList as $domain) { 10 11 $found = FALSE; 12 foreach ($urlList as $key => $url) { 13 if (strpos($url, $domain) !== FALSE) { 14 15 //キーワード検索結果の分類 →カンマで句切られているため 16 $explodeUrlList = explode(',', $url); 17 $getInfo['url'][] = $explodeUrlList[0]; 18 $getInfo['title'][] = $explodeUrlList[1]; 19 $getInfo['count'][] = $key; 20 21 $found = TRUE; 22 break; 23 } 24 } 25 26 if (!$found) { 27 $getInfo['url'][] = '該当なし'; 28 $getInfo['title'][] = '該当なし'; 29 $getInfo['count'][] = '該当なし'; 30 } 31} 32 33print_r($getInfo);

実行結果

Array ( [url] => Array ( [0] => http://sample.jp/aaa.html [1] => 該当なし [2] => http://sample.com/aaa.html ) [title] => Array ( [0] => sample.jpのサイトタイトル1 [1] => 該当なし [2] => sample.comのサイトタイトル1 ) [count] => Array ( [0] => 0 [1] => 該当なし [2] => 1 ) )

投稿2016/06/13 03:48

編集2016/06/13 05:47
KiyoshiMotoki

総合スコア4791

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

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

Chelsea_10

2016/06/13 05:04

うまくいきました!!!! ありがとうございます!! お手隙であればですが、 何回目のforeachでうまくいったかをカウントする方法はありますでしょうか。。。? foreach ($domainList as $domain) を foreach ($domainList as $key=> $domain) にして $keyでforeachの回数分とれるかとおもいきや、うまくいかなくて。。。 $getInfo['count'] = $key; ではだめなのでしょうか??
KiyoshiMotoki

2016/06/13 05:45

> foreach ($domainList as $domain) を > foreach ($domainList as $key=> $domain) にして > $keyでforeachの回数分とれるかとおもいきや、うまくいかなくて。。。 $key を追加してやるべきは内側の foreach 文の方ですね。 回答欄に追記しましたので、ご覧下さい。
Chelsea_10

2016/06/13 06:40

そうでした、、 ありがとうございます!! こちらオリジナル関数にするとしたらどのようにしたらいいのでしょうか? <?php //ドメイン $domainList = array("sample.jp","sample.co.jp","sample.com"); //URL sample.co.jp は該当しない 他は2つずつ検知されるようになっている。 $urlList = array("http://sample.jp/aaa.html,sample.jpのサイトタイトル1","http://sample.com/aaa.html,sample.comのサイトタイトル1","http://sample.org/aaa.html,sample.orgのサイトタイトル1","http://sample.jp/bbb.html,sample.jpのサイトタイトル2","sample.com/bbb.html,sample.comのサイトタイトル2"); getInfo($domainList,$urlList); $getInfo = array(); function gerInfo($domainList,$urlList) { foreach ($domainList as $domain) { $found = FALSE; foreach ($urlList as $key => $url) { if (strpos($url, $domain) !== FALSE) { //キーワード検索結果の分類 →カンマで句切られているため $explodeUrlList = explode(',', $url); $getInfo['url'][] = $explodeUrlList[0]; $getInfo['title'][] = $explodeUrlList[1]; $getInfo['count'][] = $key; $found = TRUE; return $getInfo; break; } } if (!$found) { $getInfo['url'][] = '該当なし'; $getInfo['title'][] = '該当なし'; $getInfo['count'][] = '該当なし'; return $getInfo; } } } このように記述しても Fatal error: Call to undefined function getInfo() とかえってきてしまいます。。。
KiyoshiMotoki

2016/06/13 06:57

誤記があります。  function gerInfo($domainList,$urlList) {   ↓  function getInfo($domainList,$urlList) { あと、関数内から return する位置がおかしいです。 以下のように、外側の foreach 文を抜けた後に return してください。 function getInfo(array $domainList, array $urlList) {   $getInfo = array(); // この1行も関数内に移動   foreach ($domainList as $domain) {     (中略)   }   return $getInfo; }
Chelsea_10

2016/06/13 07:18

ごめんなさい、何か自分勘違いしたfunctionを生成してしまったかもしれません。 私が行いたいのは $urlListが変わったとしても同じ処理で$getInfoを取得するという形です。 また、できれば$urlList1のときは$getInfo1, $urlList2のときは$getInfo2と違う変数名を変えて格納したいのですが、これは不可能でしょうか?? お手数ですがお答えいただけますと助かります(_ _) その場合はオリジナル関数にするのは不可能でしょうか??
KiyoshiMotoki

2016/06/13 07:32

> $urlListが変わったとしても同じ処理で$getInfoを取得するという形です。 先ほどの関数で意図通りの実装になっているはずです。 getInfo 関数の引数を適宜変えてやれば、 その時々の $urlList から情報を抜き出してくれるはずです。  $getInfo = getInfo($domainList, $urlList);  print_r($getInfo); > また、できれば$urlList1のときは$getInfo1, $urlList2のときは$getInfo2と違う変数名を変えて格納したいのですが、これは不可能でしょうか?? この一文だけでは何がやりたいのかいまいち伝わりませんが、 単に getInfo 関数の戻り値を受け取る変数名を変えれば済むことではないでしょうか?  $getInfo1 = getInfo($domainList, $urlList1);  $getInfo2 = getInfo($domainList, $urlList2); あと、そろそろ本来のご質問の主意から外れてきておりますので、これ以降は別途、ご質問を立てられることをお勧めします。 その方が、より多くの方から回答を得られると思いますので。
Chelsea_10

2016/06/13 08:03

いけました!! 本当に長々とありがとうございました!! 大変感謝しております!(_ _)
guest

0

マッチした時点でforをbreakすればよいのでは?

投稿2016/06/13 03:07

yambejp

総合スコア114839

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

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

Chelsea_10

2016/06/13 03:40

ご回答ありがとうございます! breakを用いて、期待したデータになることができました!!ありがとうございます。 ただ、もう一点問題が生じています。。。 上記コードを変更しましたので、もしお手隙であればご回答いただけますと助かります(_ _)
yambejp

2016/06/13 04:34

elseの使い方がおかしい forの前にヒットなしの値をいれておけばOKよ $getInfo = array(); $getInfo['url'] = "該当なし"; $getInfo['title'] = "該当なし"; for($i=0;$i<=2;$i++) { foreach( $urlList as $key => $url ) { if(preg_match('{'.preg_quote("{$domainList[$i]}").'}i',$url,$match) === 1) { $explodeUrlList = explode( ',', $url); $getInfo['url'] = $explodeUrlList[0]; $getInfo['title'] = $explodeUrlList[1]; break; } } }
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問