人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

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);
-下記 以上
よろしくお願いします

●質問者: kohhi
●カテゴリ:ウェブ制作
○ 状態 :終了
└ 回答数 : 2/2件

▽最新の回答へ

1 ● a-kuma3
●100ポイント

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.'">';
}
?>

kohhiさんのコメント
早速お返事ありがとうございました。

2 ● ぽけっとしすてむ
●150ポイント ベストアンサー

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はどのような挙動をしているのかをステップ実行をしながら確認をすると、理解が深まると思います。


kohhiさんのコメント
勉強の方法まで教えていただき、ありがとうございます。

kohhiさんのコメント
>ステップ実行をしながら確認をする 締めきったとですいません。 1.imgタグのある部分を、$elementにキー値をつけて代入 2.$iに1を足して5以上だったら処理中止 3.$element変数のsrc要素を$src変数のkey値に代入する 言葉で表現すると、上記1-3ということですかね。 (言葉で表現できないかもしれませんが) 3の $src[$key] = $element->src; の意味がよくわかりませんが、場数踏んで感覚で覚えるしかないですかね?

ぽけっとしすてむさんのコメント
一つの感覚としての捉え方となりますが、色々な味が入ったお菓子が$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 ふわふわとした解説ですが、参考になれば幸いです。

kohhiさんのコメント
ありがとうございました。 もう何年も、初心者レベルです。 雲が晴れてきたような感じを味わっております。 「->」の使い方、意味がよくわからなかったように思っております。 ありがとうございました。 これからもよろしくお願いします。
関連質問

●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ