
下記のようなプログラムでCSVを出力する場合、
foreachの中の条件で'flag'の列が'on'だった場合、その人の名前が初めに現れる行のidを変更して出力したいのですが同じループの中でさかのぼって変更することは可能ですか?
'flag'が'on'になるのは、必ずその人の名前のなかで一番最後の行に決まっています。
名前が1行しか登場しない場合もあります。
名前が現れる最初の番号を$Pnameのように取得しておいて、それをもとに遡って編集できればと思っているのですが、☆の部分のように$editというような新たな配列を作って、別のforeachの中で出力するしかありませんか?
実際には$listの行が10000以上になるため、出来たら1回のforeachで処理したいのですが何かいい方法はありませんか?
質問がおかしかったり、解りづらかったらすみませんが、ご教示お願いいたします。
$list = array (
array('No', '名前', '年齢','flag','id'),
array('1', '田中', '18','null','null'),
array('2', '田中', '20','null','null'),
array('3', '田中', '22','on','null'),
array('4', '鈴木', '19','null','null'),
array('5', '鈴木', '14','on','null'),
array('6', '山田', '14','on','null'),
array('7', '吉田', '19','null','null'),
array('8', '吉田', '14','on','null')
);
$fo = fopen('C:\works\add.csv', 'w');
$i = 1;
foreach ($list as $fields) {
fputcsv($fo, $fields);
$Pname = $list[1];
if($Pname != $list[1]){
$line = $i;
}
$edit[] = $fields; // ☆
$i = $i +1;
}
fclose($fo);
質問者からの補足コメント
No.3ベストアンサー
- 回答日時:
$listの内容を書き換えて良いなら、
$listを全要素を検索し、flagが'on'になった時、名前の最初の要素のid
を変更します。
但し、同じ名前は連続して出現することが前提です。
$list = array (
array('No', '名前', '年齢','flag','id'),
array('1', '田中', '18','null','null'),
array('2', '田中', '20','null','null'),
array('3', '田中', '22','on','null'),
array('4', '鈴木', '19','null','null'),
array('5', '鈴木', '14','on','null'),
array('6', '山田', '14','on','null'),
array('7', '吉田', '19','null','null'),
array('8', '吉田', '14','on','null')
);
$name ="";
for ($i = 1; $i < sizeof($list);$i++){
if ($name != $list[$i][1]){
$name = $list[$i][1];
$topix = $i;
}
if ($list[$i][3] == 'on'){
$list[$topix][4] = "NEWID";
}
}
上記の処理で名前が初めに現れる行のidが"NEWID"に変更される。
以降、この内容をファイルへ出力する。
No.2
- 回答日時:
素直に走査用の foreach を事前に行いましょう
この程度の処理ならば10000程度など気にする量ではないでしょう。
$memo = array();
foreach ($list as $fields) {
_ if(フラグが立っている) $memo[名前] = true;
}
foreach ($list as $fields) {
_ if(名前が変わった && isset($memo[名前])) {
_ _ id変更($fields);
_ }
_ 出力($fields);
}
ありがとうございます。質問では関連する部分しか記載していませんでしたが実際にはその他にもいろいろ処理したいことがあるので出来たら1つのループで出来たらと思っていました。わかりづらくてすみませんでした。
ありがとうございます。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
STLのvectorで作った配列をメン...
-
多次元配列をエンコードする関...
-
行列
-
C++ VS2005におけるイテレータ...
-
PHPでCSVを出力するさいに、ル...
-
数値 1 を文字列"01"に変換したい
-
C言語の配列をPush(追加)する...
-
プルダウンメニューにDBの内容...
-
配列をループでたくさん宣言し...
-
file_existsでファイル名の部分...
-
foreachで上限回数指定方法また...
-
行数が30万件ほどあるCSVから、...
-
phpとmysqlで「あいまい検索」...
-
String だと「 ByRef引数の型が...
-
pdfファイルの複数添付 引数の型
-
連想配列のprint_rやvar_dump出...
-
$_SESSIONに二次元配列を使える...
-
ヒアドキュメントの中のfor文
-
foreachのなかで次のキーを参照...
-
PHP掲示板で新着順に表示させた...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
C言語の配列をPush(追加)する...
-
cakephpでのトランザクション処...
-
行列
-
読み(あ行~わ行)ごとに分け...
-
特定の文からメールアドレスの...
-
c言語 単位行列
-
STLのvectorで作った配列をメン...
-
多次元配列をエンコードする関...
-
2次元配列を1次元配列にするには
-
phpで、配列の値が意図せず変わ...
-
Delphiで別unitで宣言した「TAr...
-
連想配列に追加ってできるン?
-
正規表現
-
配列の並びについて
-
PHPでCSVを出力するさいに、ル...
-
pascalについて知りたいのです...
-
文字列の取得について
-
ファイルの書き込みについて教...
-
数独かを判断するプログラム
-
文字列の並び替え
おすすめ情報