アプリ版:「スタンプのみでお礼する」機能のリリースについて

下記のようなプログラムで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);

質問者からの補足コメント

A 回答 (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"に変更される。
以降、この内容をファイルへ出力する。
    • good
    • 0
この回答へのお礼

まさに私がやりたかった事です!
おかげさまで無事解決しました。
ありがとうございました。

お礼日時:2022/10/28 05:32

素直に走査用の foreach を事前に行いましょう


この程度の処理ならば10000程度など気にする量ではないでしょう。

$memo = array();
foreach ($list as $fields) {
_ if(フラグが立っている) $memo[名前] = true;
}
foreach ($list as $fields) {
_ if(名前が変わった && isset($memo[名前])) {
_ _ id変更($fields);
_ }
_ 出力($fields);
}
    • good
    • 0
この回答へのお礼

ありがとうございます。質問では関連する部分しか記載していませんでしたが実際にはその他にもいろいろ処理したいことがあるので出来たら1つのループで出来たらと思っていました。わかりづらくてすみませんでした。
ありがとうございます。

お礼日時:2022/10/28 05:34

一旦、ファイルへ書いたものを、修正したいということになるので、


出力しながらでは、無理でしょうね。
1回のforeachでは無理だと思います。
    • good
    • 0
この回答へのお礼

なるほど、では$Pnameと変更予定のidを配列に保存しておいて,
foreachの中で$editと保存しておいた配列で再度処理する必要があるのですね。
ありがとうございます。

お礼日時:2022/10/27 18:06

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!