phpを勉強中です。

ある初歩的なサンプルプログラムと格闘中でして、教えていただきたく質問させてください。

繰り返し命令をする事で連続して値を取得し、それをCSVに書き込む、というプログラムなのですが、
これを繰り返さず、一回だけの実行にしたいのです。
おそらく、繰り返しの部分は、

file_put_contents( $tmp_file, array2csv( $csv_line ), FILE_APPEND );

という部分なんだと思うのですが、これをどう書き換えたら一度だけの値取得になるのでしょうか。
教えてください、よろしくお願いいたします。

※下記補足情報に全体のコ-ドを表記させていただきました

回答の条件
  • 1人5回まで
  • 13歳以上
  • 登録:2014/07/31 07:12:58
  • 終了:2014/08/01 09:50:14

ベストアンサー

id:sasada No.3

sasada回答回数1482ベストアンサー獲得回数1332014/07/31 16:18:26

ポイント350pt

$xml->Featureを一回(ひと塊)だけ取れれば良いのなら

while ( $int_ac < 48 )

while ( $int_ac < 2 )

にして、

  $total = (int)$xml->ResultInfo->Total;

  $total = (int)2

でいかがでしょうか。

他3件のコメントを見る
id:sasada

これは失礼しました。 m(_ _)m

$int_ac = 5;
とするコ-ドではどうなるか教えていただけませんでしょうか。

とのこと。
 ppn_request()で"&ac={$ac}"の順番で塊がget出来るようにurlが設計されていたら、

  $int_ac = 5;
  while ( $int_ac < 6 )

を実行すれば、うまくいくと思います^^

    $total = (int)$xml->ResultInfo->Total;

は原文ままでいけるかもしれません。余分なデータも取得するようなら

    $total = (int)2;

にしてください。
 あと、ポイントの上積みは結構ですよ。

2014/08/01 09:03:24
id:ykhpno1

!!
ありがとうございます。完璧な動作となりました!!
同時にたいへん勉強になりました。
本当にありがとうございます!

2014/08/01 09:48:23

その他の回答(2件)

id:yoneto164 No.1

ヨネちゃん回答回数813ベストアンサー獲得回数942014/07/31 09:16:13

ポイント10pt

おそらくその行はループの中に入っていると思われます。
全体を見なければ正確には分からないのですが、その行の直後に
break;
を付ければループを抜けて処理が1回になる可能性が高いです。

id:ykhpno1

ご回答いただき誠にありがとうございます。
break;
を試させていただきましたがダメでした。
おっしゃる通り、全体を提示しないと答えが出ない類の問題のようです。
なので全体のコ-ドを補足として書かせていただきます。
更なる回答をいただければ嬉しく、なにとぞよろしくお願いいたします。
レスをいただきありがとうございました。

2014/07/31 10:36:37
id:ykhpno1

コ-ド全体は以下となります。
後出しで申し訳ありません。。

※表示がおかしくなるので一部大文字で表記しております。


<?php

require( dirname( __FILE__ ) . '/config.php' );
file_put_contents( $lock_file, getmypid() );
$gc = $argv[1];
$out_file = dirname( __FILE__ ) . '/csv/yolp-' . $gc . '.csv';
$tmp_file = dirname( __FILE__ ) . '/tmp/yolp-' . $gc . '.csv';

$csv_headers = array(
'post_title',
'station',
);

file_put_contents( $tmp_file, array2csv( $csv_headers ), FILE_APPEND );
$batch_size = 100;
$int_ac = 1;
while ( $int_ac < 48 )
{
$target_ac = str_pad( $int_ac, 2, '0', STR_PAD_LEFT );
$xml = ppn_request( $appid, $cid, 1, 1, $gc, $target_ac );
$total = (int)$xml->ResultInfo->Total;

$start = 1;
$retrieved = 0;

while ( $retrieved < $total )
{
$xml = local_search_request( $appid, $cid, $start, $batch_size, $gc, $target_ac );

foreach ( $xml->Feature as $f )
{
$ac = $f->Property->GovernmentCode;
$latlon = explode( ',', $f->Geometry->Coordinates );
$station = '';
foreach($f->Property->Station as $s)
{
$station = $station . $s->Railway . ' ' . $s->Name . "\n";
}

$csv_line = array(
$f->Name,
$station,
);

file_put_contents( $tmp_file, array2csv( $csv_line ), FILE_APPEND );
}
$retrieved += (int)$xml->ResultInfo->Count;
$start += (int)$xml->ResultInfo->Count;
}

$int_ac += 1;
}
rename( $tmp_file, $out_file );
unlink( $lock_file );
function ppn_request( $appid, $cid, $start = 1, $num = 10, $gc = null, $ac = null )
{
$api = '~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~';
$url = "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~";

if ( $gc !== null )
{
$url = $url . "&gc={$gc}";
}

if ( $ac !== null )
{
$url = $url . "&ac={$ac}";
}
$res = file_get_contents($url);
$xml = simplexml_load_string($res);
return $xml;
}

function array2csv( $array )
{
$fp = fopen('php://memory', 'r+');
fputcsv($fp, $array);
rewind($fp);
$csv_line = stream_get_contents($fp);
fclose($fp);
return $csv_line;
}

id:ykhpno1

質問文を編集しました。詳細はこちら

id:sasada No.2

sasada回答回数1482ベストアンサー獲得回数1332014/07/31 11:05:17

ポイント10pt

えーと、

  $total = (int)$xml->ResultInfo->Total;

  $total = (int)1;

にかえて、

  file_put_contents( $tmp_file, array2csv( $csv_line ), FILE_APPEND );
  break; // この行を追加

としてみては?

id:ykhpno1

回答をいただき誠にありがとうございます!
実際にアドバイスいただいた部分を実装してみて私の説明不足からとんだ誤解を招いてしまっていることに気が付きました。
私の説明が至らなかったのが原因です、誠に申し訳ございません。

アドバイスいただいた形では、例えばAからZまでのデ-タの塊があったとして、それぞれのデ-タから最初の値を1つずつ取得する、というものになりました。

最初困っていたのが、Aのデ-タの塊を全て取得したあと、B,C,D~と順番にZの塊まで取得してしまっておりました。
これを、Aの塊を取得するだけでプログラムをストップさせたいのです。
(一回だけの実行にしたい、という言葉が誤解を招いたと思います)

おそらくはコ-ドを精査していただいたんだと思います、本当に大変申し訳ございません。
レスをいただき誠にありがとうございました。

上記の追加説明を補足欄に書き足したいと思います。
申し訳ありません、ご寛恕ください。

2014/07/31 13:27:52
id:ykhpno1

目指すコ-ドの追加説明をさせていただきます。

現状は、例えばですが、AからZまでのデ-タの塊があったとして、Aのデ-タの塊を全て取得したあと、B,C,D~と順番にZの塊まで取得してしまっておりました。
これを、Aの塊を取得するだけでプログラムをストップさせたいのです。
(最初であるAのデ-タは全て取得したいのです)

わかりにくい説明で申し訳ありません。

id:sasada No.3

sasada回答回数1482ベストアンサー獲得回数1332014/07/31 16:18:26ここでベストアンサー

ポイント350pt

$xml->Featureを一回(ひと塊)だけ取れれば良いのなら

while ( $int_ac < 48 )

while ( $int_ac < 2 )

にして、

  $total = (int)$xml->ResultInfo->Total;

  $total = (int)2

でいかがでしょうか。

他3件のコメントを見る
id:sasada

これは失礼しました。 m(_ _)m

$int_ac = 5;
とするコ-ドではどうなるか教えていただけませんでしょうか。

とのこと。
 ppn_request()で"&ac={$ac}"の順番で塊がget出来るようにurlが設計されていたら、

  $int_ac = 5;
  while ( $int_ac < 6 )

を実行すれば、うまくいくと思います^^

    $total = (int)$xml->ResultInfo->Total;

は原文ままでいけるかもしれません。余分なデータも取得するようなら

    $total = (int)2;

にしてください。
 あと、ポイントの上積みは結構ですよ。

2014/08/01 09:03:24
id:ykhpno1

!!
ありがとうございます。完璧な動作となりました!!
同時にたいへん勉強になりました。
本当にありがとうございます!

2014/08/01 09:48:23

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

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

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

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

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません