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

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

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

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

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

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

●質問者: ykhpno1
●カテゴリ:インターネット ウェブ制作
○ 状態 :終了
└ 回答数 : 3/3件

▽最新の回答へ

1 ● ヨネちゃん
●10ポイント

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


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

質問者から

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

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


<?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;
}


2 ● sasada
●10ポイント

えーと、

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

 $total = (int)1;

にかえて、

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

としてみては?


ykhpno1さんのコメント
回答をいただき誠にありがとうございます! 実際にアドバイスいただいた部分を実装してみて私の説明不足からとんだ誤解を招いてしまっていることに気が付きました。 私の説明が至らなかったのが原因です、誠に申し訳ございません。 アドバイスいただいた形では、例えばAからZまでのデ?タの塊があったとして、それぞれのデ?タから最初の値を1つずつ取得する、というものになりました。 最初困っていたのが、Aのデ?タの塊を全て取得したあと、B,C,D?と順番にZの塊まで取得してしまっておりました。 これを、Aの塊を取得するだけでプログラムをストップさせたいのです。 (一回だけの実行にしたい、という言葉が誤解を招いたと思います) おそらくはコ?ドを精査していただいたんだと思います、本当に大変申し訳ございません。 レスをいただき誠にありがとうございました。 上記の追加説明を補足欄に書き足したいと思います。 申し訳ありません、ご寛恕ください。

質問者から

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

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

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



1-5件表示/6件
4.前の5件|次5件6.
関連質問

●質問をもっと探す●



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