PHP5.3で、最初の5つの画像だけ配列に入れる処理が書けません。


すべての画像を抽出するプログラム
-以下
include_once('simple_html_dom.php');
$html = file_get_html( '**' );
$src = array();
foreach($html->find('img') as $key => $element){
$src[$key] = $element->src;
}
foreach($src as $img){
echo '<img src="'.$img.'">';
}
-以上
http://www.kaasan.info/archives/1457
のサイトをほぼ写しただけで動きます。
最初の5つだけを抽出する構文が書けません。

僕の書いた下記内容だと無限ループしているように思います。
下記内容を元に修正orアドバイスいただけると助かります。
-下記(最初の5つの画像だけ配列に入れる)僕が書いたプログラム
$src = array();
for ($i = 1; $i <= 5; $i++) {
$src[] = $html->find('img');
}
print_r($src);
-下記 以上
よろしくお願いします

回答の条件
  • 1人5回まで
  • 登録:
  • 終了:2013/09/26 21:40:46
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:psne No.2

回答回数605ベストアンサー獲得回数334

ポイント150pt

break を使用してはダメですか?

foreach($html->find('img') as $key => $element){ 
	$src[$key] = $element->src; 
} 


$i=0;

foreach($html->find('img') as $key => $element){ 
	$i++;
	if( $i > 5 ) {
		break;
	}
 	$src[$key] = $element->src; 
}


----
ああ、回答が被りましたね。やっていることは同じです。
$html->find('img')が何をしているのか、$key => $elementはどのような挙動をしているのかをステップ実行をしながら確認をすると、理解が深まると思います。

他2件のコメントを見る
id:psne

一つの感覚としての捉え方となりますが、色々な味が入ったお菓子が$element
そのなかの一つの味を指定したものが$element->srcになります。


まず、$htmlという巨大な箱にimgタグやdivタグ等の全てを入れます。($htmlというオブジェクトが出来上がります。)
今回は、imgタグ以外は必要ないので、$html->find('img')としてimgタグだけを分別します。

ここまでをコードで表すと、以下になります。(例として取得先はこのページにします。)

include_once('simple_html_dom.php');
$html = file_get_html( 'http://q.hatena.ne.jp/1380187850’ );
$src = array();

$c=$html->find('img');

この例の場合、$htmlの中には1500個程度、$html->find('img')の結果を入れた$cには70個程度の何かが入った箱(要素)が入っています。
今回、$cには順番に番号が振ってあります。

これで「1.imgタグのある部分を、$elementにキー値をつけて代入」の準備が出来たので、実際にforeachを使って箱の中身を開けていきます。

foreach($c as $key => $element){
//$c=imgの要素が入った色々な箱たち
//$key=箱の指名
//$element=指名された箱の「中身」
$src[$key] = $element->src;
}

※「2.$iに1を足して5以上だったら処理中止」は抜いてあります。
$elementの中はURLだけじゃないの?と感じますが、説明文や、HTMLのクラス名など、色々入っています。
ですから、「$elementの中にあるsrc(URL)が欲しいのです」と指名してあげます。
これが、$element->src
これを$srcという新しい箱に移し替えるのですが、その際に名前を付けておきたいので、$keyをそのまま使っています。
この部分が「3.$element変数のsrc要素を$src変数のkey値に代入する」です。


「$cには順番に番号が振ってある」ならforでも何とかなりそう?
出来なくもありませんが、

$a = array(
"one" => "ひとつめ",
"two" => "ふたつめ",
"three" => "みっつめ",
"seventeen" => "突然の17"
);

foreach ($a as $key => $value) {
echo "\$a[$key] => $value.\n";
}

こんな使い方も出来るのです。
http://php.net/manual/ja/control-structures.foreach.php

ふわふわとした解説ですが、参考になれば幸いです。

2013/09/27 00:55:00
id:kohhi

ありがとうございました。
もう何年も、初心者レベルです。

雲が晴れてきたような感じを味わっております。
「->」の使い方、意味がよくわからなかったように思っております。

ありがとうございました。
これからもよろしくお願いします。

2013/09/27 10:48:13

その他の回答1件)

id:a-kuma3 No.1

回答回数4973ベストアンサー獲得回数2154

ポイント100pt

src に五個のデータを突っ込んだら、ループから抜けるようにしてみました。

<?php
include_once('simple_html_dom.php');
$html = file_get_html( '**' );
$src = array();
$i = 0;
foreach($html->find('img') as $key => $element){
    $src[$key] = $element->src;
    if (++$i >= 5) {
        break;
    }
}
foreach($src as $img){
    echo '<img src="'.$img.'">';
}
?>
id:kohhi

早速お返事ありがとうございました。

2013/09/26 21:38:37
id:psne No.2

回答回数605ベストアンサー獲得回数334ここでベストアンサー

ポイント150pt

break を使用してはダメですか?

foreach($html->find('img') as $key => $element){ 
	$src[$key] = $element->src; 
} 


$i=0;

foreach($html->find('img') as $key => $element){ 
	$i++;
	if( $i > 5 ) {
		break;
	}
 	$src[$key] = $element->src; 
}


----
ああ、回答が被りましたね。やっていることは同じです。
$html->find('img')が何をしているのか、$key => $elementはどのような挙動をしているのかをステップ実行をしながら確認をすると、理解が深まると思います。

他2件のコメントを見る
id:psne

一つの感覚としての捉え方となりますが、色々な味が入ったお菓子が$element
そのなかの一つの味を指定したものが$element->srcになります。


まず、$htmlという巨大な箱にimgタグやdivタグ等の全てを入れます。($htmlというオブジェクトが出来上がります。)
今回は、imgタグ以外は必要ないので、$html->find('img')としてimgタグだけを分別します。

ここまでをコードで表すと、以下になります。(例として取得先はこのページにします。)

include_once('simple_html_dom.php');
$html = file_get_html( 'http://q.hatena.ne.jp/1380187850’ );
$src = array();

$c=$html->find('img');

この例の場合、$htmlの中には1500個程度、$html->find('img')の結果を入れた$cには70個程度の何かが入った箱(要素)が入っています。
今回、$cには順番に番号が振ってあります。

これで「1.imgタグのある部分を、$elementにキー値をつけて代入」の準備が出来たので、実際にforeachを使って箱の中身を開けていきます。

foreach($c as $key => $element){
//$c=imgの要素が入った色々な箱たち
//$key=箱の指名
//$element=指名された箱の「中身」
$src[$key] = $element->src;
}

※「2.$iに1を足して5以上だったら処理中止」は抜いてあります。
$elementの中はURLだけじゃないの?と感じますが、説明文や、HTMLのクラス名など、色々入っています。
ですから、「$elementの中にあるsrc(URL)が欲しいのです」と指名してあげます。
これが、$element->src
これを$srcという新しい箱に移し替えるのですが、その際に名前を付けておきたいので、$keyをそのまま使っています。
この部分が「3.$element変数のsrc要素を$src変数のkey値に代入する」です。


「$cには順番に番号が振ってある」ならforでも何とかなりそう?
出来なくもありませんが、

$a = array(
"one" => "ひとつめ",
"two" => "ふたつめ",
"three" => "みっつめ",
"seventeen" => "突然の17"
);

foreach ($a as $key => $value) {
echo "\$a[$key] => $value.\n";
}

こんな使い方も出来るのです。
http://php.net/manual/ja/control-structures.foreach.php

ふわふわとした解説ですが、参考になれば幸いです。

2013/09/27 00:55:00
id:kohhi

ありがとうございました。
もう何年も、初心者レベルです。

雲が晴れてきたような感じを味わっております。
「->」の使い方、意味がよくわからなかったように思っております。

ありがとうございました。
これからもよろしくお願いします。

2013/09/27 10:48:13

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません