• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:配列の差し替えについて)

配列の差し替えについて

このQ&Aのポイント
  • 配列について勉強をしています。データを差し替えるプログラムを考えていて色々試してみたのですが、うまく機能しません。
  • 指定した箇所に追加書き込みになってしまったり、指定箇所が削除され別の箇所に追加書き込みになってしまったり、まったく機能しなくなってしまったりする問題に困っています。
  • 外部から「サンプル03」という値を呼び出し、CSVデータと照合させて一致したらその箇所を「array_splice」で置換えるようにしているはずなのですが、うまく機能しません。どなたか知恵を貸していただけると助かります。

質問者が選んだベストアンサー

  • ベストアンサー
  • dell_OK
  • ベストアンサー率13% (742/5653)
回答No.1

ポイント1  $line=explode(",",$Data[$i]); で展開された配列は[0]から始まります。 なのでデータの照合はこうなると思います。  $edit_data==$line[0] ポイント2 サンプルのCSVは列が1つのようなので気づいたのですが、 例えば「サンプル01」は「サンプル01(改行)」がデータになっています。 なので「サンプル03」と「サンプル03(改行)」が等しくないため、 データの照合がうまくできませんでした。 読み込んだデータを  $Data[$i]=rtrim($Data[$i]); などとして、改行をなくしておき、出力時には、  fputs($fp,$item."\n"); などとして、改行を入れてみました。 ポイント3 出力処理はループの外でよろしいかと思います。 と言うわけで参考までに私が変更したソースを載せます。 が、もっといい方法、正しい方法があるのかも知れません。 $edit_data="サンプル03";//テストのために設定 $test = "サンプル05"; $Data=file("data.csv"); for($i=0; $i<sizeof($Data);$i++){ $Data[$i]=rtrim($Data[$i]);//改行をなくす処理を追加 $line=explode(",",$Data[$i]); if($edit_data==$line[0]){//[1]を[0]に変更 array_splice($Data,$i,1,$test); } } //出力処理をループの外へ $fp=fopen("data.csv","w"); flock($fp, LOCK_EX); foreach($Data as $item) fputs($fp,$item."\n");//改行をつける fclose($fp);

maxves
質問者

お礼

ありがとうございます。 アドバイスを頂いたポイントを元に組みなおしました。 意外とすんなりと修正できました。 この度は誠にありがとう御座いました。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • array_spliceでの置き換えについて

    リファラでカウントカウントを図りたいと考えています。 内容としては、http://www.hoge.net/からのアクセスに対して 『hoge』だけと抽出し、格納しているCSVと照合し正ならカウント+1として「array_splice」で置き換えてる 単純なプログラムなのですが書き込まれるCSVに何故か空の行が下記のように挿入されてしまいます。 CSVの中身 --------------------------------------------- 0,http://www.sample.net 0,http://www.hoge.net 0,http://www.test.net 0,http://www.xxxx.net ↓↓↓↓↓↓↓↓↓↓↓ 0,http://www.sample.net 1,http://www.hoge.net [空白] 0,http://www.test.net 0,http://www.xxxx.net --------------------------------------------- また、アクセスする度に空白行が増えていく状況です。 別のプログラムでも「array_splice」は使っていますが いずれも正常に置き換えられています。 ソースを記述しますので何が原因なのかわかりません。 何方かアドバイスを頂ければと思います。 ソース --------------------------------------------- $string = $_SERVER['HTTP_REFERER']; $regex = "(http:\/\/)([^\/]+)(\/.*$)?"; match ( $string, $regex ); function match ( $string, $regex ) { if ( preg_match ( "/".$regex."/i", $string, $match ) ) { $keyURL=$match[2]; $Data=file("../csv/sample.csv"); for($i=0;$i<sizeof($Data);$i++){ $line=explode(",",$Data[$i]); if(ereg("$keyURL",$line[1])){ $count="$line[0]" + 1; $lines=array($count,$line[1]); $lines=implode(",",$lines); $lines=$lines."\n"; array_splice($Data,$i,1,$lines); $fp=fopen("../csv/sample.csv","w+"); flock($fp, LOCK_EX); foreach($Data as $item)fputs($fp,$item); fclose($fp); } } } } --------------------------------------------- 宜しくお願い致します。

    • ベストアンサー
    • PHP
  • CSVファイルの上書き

    CSVファイルを$line[0] = $nowの時、上書きするということをしたいのですが、array_spliceでうまくいきません。 アドバイスお願いします。 $fp = fopen('log/order.csv', 'a+'); flock($fp,LOCK_EX); if ($fp) { require_once( "./common.php" ); $AddressData = LoadTextFile( "./log/order.csv", "SJIS", "SJIS" ); if ( $AddressData == false ) { exit; } else { for ( $i = 0; $i < sizeof( $AddressData ); $i++ ) { $line = explode( ",", $AddressData[ $i ] ); if($line[0] = $now){ array_splice($line, 1, 3, array("1","2","3")); #fputs($fp, $buf2); flock($fp,LOCK_UN); fclose($fp); } } } }

    • 締切済み
    • PHP
  • データベースに削除機能を追加しようと思ったのですがうまく削除されなく困っています

    データベースの出入力は出来たのですが 新たに削除機能を追加しようと思っています。 私的にはこのようなイメージでつくったつもりなのですが・・・ -------------------------------------- dat.csvの中みが下記とします。 りんご バナナ スイカ メロン 削除フォームにバナナを打ち込み実行するとバナナが削除され繰上げされる。 りんご スイカ メロン -------------------------------------- 判る範囲で組んでみたのですが 全て削除してしまったり、上から順番に削除してしまったり、削除機能自体が機能しなくなったりと 困っています。 何方か知恵を貸して頂ければと思います。 宜しくお願いいたします。 ■現状のソース <?php if($_POST["dell"]){ $dele = $_POST["dele_ad"]; $Data=file("dat.csv"); for($i=0;$i<sizeof($Data);$i++){ $dele_ad = explode(",",$Data[$i]); if($dele_ad == $dele ){ array_splice($dele_ad,$i,1); } } $fp=fopen("dat.csv","w"); flock($fp, LOCK_EX); foreach($Data as $line)fputs($fp,$line); fclose($fp); print "削除しました"; } ?> <form action="<?=$_SERVER[ "PHP_SELF" ]?>" method="POST"> <input name="dele_ad" type="text" value="" size="40"> <input type="submit" name="dell" value="削除"> </form>

    • ベストアンサー
    • PHP
  • 配列をファイルに書き込む方法

    下記($dataに入ってる)配列をファイルに書き込みたいのですが、書き込み方法が分かりません、教えていただけませんでしょうか・・・。 $dataの中身は Array ( [0] => あいうえお [1] => かきくけこ [2] => さしすせそ [3] => たちつてと ) これを $fp=fopen("1.txt","w"); fputs($fp,$data); fclose($fp); にするとArrayとだけ表示されます。 あいうえお\n かきくけこ\n さしすせそ\n たちつてと\n と書き込みたいのですが・・・、お願いします。

    • ベストアンサー
    • PHP
  • csvファイルを読み込んで二次元配列に格納したい

    200×250のある数字と文字の入力されたcsvファイル(またはtxtファイル)を読み込んで2次元配列に格納したいのです。 色々調べるとカンマの処理が必要ということがわかりましたが、どのようにソースを書けばよいかわかりません。使用言語はC言語です。 また、実際にcsvファイルを読み込むようにプログラムを書いてみましたが、すべて-858993460となって表示されます。 プログラミング初心者で勉強中なため困っています。 回答よろしくお願いします。 #include <stdio.h> #include <stdlib.h> #define row 200 #define column 250 int main() { int i, j; int data[row][column]; FILE *fp; fp = fopen("sample.csv", "r"); if (fp == NULL){ printf("ファイルがありません\n"); return 1; } for (i = 0; i < row; i++){ for (j = 0; j < column; j++){ fscanf(fp, "%lf", &data[i][j]); } } for (i = 0; i<row; i++){ for (j = 0; j < column; j++){ printf("%3d ", data[i][j]); } printf("\n"); } fclose(fp); return 0; }

  • PHPでの文字列の扱い

    以下のPHPを書きましたが if文の$aに期待する値が入りません。この場合はどのようにすればよいのでしょうか? $a = "\$item[2] == \"1\" || \$item[2] == \"4\""; $Data = file("data.csv"); for($i = 0; $i < sizeof($Data); $i++){ $item = explode(",", $Data[$i]); if($a){ include('list.php'); } }

    • 締切済み
    • PHP
  • テキストファイルにあるシリアライズされた複数の多次元配列データを日付順にソートした後に10レコードずつ表示する方法について

    PHPプログラミング初心者のAJYAMAと申します。 表題にあるようなことが、したいのですが、以下のコードでできなくて困っています。どなたか、良きアドバイスをいただけないでしょうか? <POSTされた値のテキストファイルへの書き込み> $lines=array($recordID,$nickname,$date,$area,$num,$item,$size); //データをシリアル化 $serializedLines=serialize($lines); //テキストファイルに改行を入れ、一行にデータを収納する $serializedLines=$serializedLines."\n"; //txtファイルに書き込み $fp=fopen("report.txt","a"); flock($fp, LOCK_EX); fputs($fp,$serializedLines); fclose($fp); /* <データ(変数)の値> テキストファイルにシリアル化して格納されたデータの状態 array(0 => $recordID  例)array(1) $nickname  例)array(Ajyama) $date 例)array(2008/8/30,2008/9/3,2008/9/4) $area 例)array(東京,大阪,名古屋) $num 例)array(01,02,03) $item 例)array(りんご,バナナ,メロン) $size 例)array(大,中,小) ) */ <テキストファイルからデータを読み込み、HTMLへの展開> <?php //ファイルを開く $handle=fopen(dirname(__FILE__)."/../mod/report.txt","r"); //データを呼び出す while(($serialrow=fgets($handle,1024))!==FALSE){ //シリアライズを解除して変数に格納 $row=unserialize($serialrow); //展開したデータを配列に格納(ソートするため) $data[]=array($recordID,$nickname,$date,$area,$num,$item,$size) } fclose($handle); //変数の展開 foreach($data as $key=>$row){ //ソート array_multisort($d,SORT_DESC,SORT_NUMERIC,$num,SORT_DESC,SORT_NUMERIC,$data); //レコード数毎にページを制御 $Cid=$_GET['cid']; $Size=sizeof($data); $P=$_GET["p"]; if($P>0){ $Prev=$P-1; $PrevPage="<a href=".$_SERVER['PHP_SELF']."?p={$Prev}&&cid={$Cid}>前の10件</a>"; } if($Size/10-1>$P){ $Next=$P+1; $NextPage="<a href=".$_SERVER['PHP_SELF']."?p={$Next}&&cid={$Cid}>次の10件</a>"; } if($P==0&&$Size/10<=1){ $NextPage=""; } ?> <h2><?php echo $CatTitle?></h2><BR> 全 <?=$Size?>件 | <?=$PrevPage?> <?=$NextPage?> <?=$NumP?> //配列変数の展開 <?php for($i=$P*10;$i<$P*10+10;$i++){ for($j=0;$j<$no;$j++){ echo <<<EOF <table > <tr> <td>{$recordID[$i]}</td> <td>{$nickname[$i]}</td> <td>{$date[$i][$j]} {$area[$i][$j]} {$num[$i][$j] {$item[$i][$j]} {size[$i][$j]}</td> </tr> </table> EOF; } } ?>

    • 締切済み
    • PHP
  • Flash 配列

    Flashでcsvファイルを読み込みんでいます。 ▼csvファイル中身 a,あんぱん,100(改行) b,食パン,180(改行) c,カリーパン,120(改行) ▼AS --------------------------------------------------------- var abc = new LoadVars(); var itemlist:Array = new Array(); abc.onData = function(data) { itemlist = data.split("\r\n"); if (itemlist[itemlist.length-1].length == 0) { itemlist.pop(); } for (var i:Number = 0; i<itemlist.length; i++) { itemlist[i] = itemlist[i].split(","); } } abc.load("book1.csv"); --------------------------------------------------------- 上記のASで読み込んだcsvファイルのデータを解析しています。 trace(itemlist[1][1]) で「食パン」を取り出したり出来ています。 ここで、 あんぱん,食パン,カリーパン と、3つの要素を持つ配列を作りたいのですが、 どうすればよいのでしょうか? pushやsliceを使用したのですが無知な為うまくいきませんでした (T_T;)

  • 限られた数の配列のみ表示させる

    配列の基本的なことを理解していないので、極めて初歩的な質問で申し訳ありませんが、ご教示お願い致します。 csvを読み込み、条件を満たすデータ(ここでは$row[1]がy)だけで配列を作ります。 $handle = fopen("sample.csv", "r"); while (($row = fgetcsv($handle, 1000, ",")) !== FALSE) {if($row[1]=="y"){ $data[] = array( $row[0] ,$row[1] ,$row[2] ,$row[3]); } } fclose($handle); すべての行のデータ(ここでは$row[2]のみ)は下記で表示されます。 foreach ($data as $key => $row) { print $row[2]."<BR>"."\n"; 最初から例えば4行目までのみ表示したい場合 for($i=0;$i<4;$i++){ print $data[$i]."<BR>"."\n"; } 上記では、arreyの文字が4個しか表示されませんが、先の例のように各行の$row[2]を表示させるには、どのようにすればよいのでしょうか。 宜しくお願いします。

    • 締切済み
    • PHP
  • aaa.csvとbbb.csvを条件で抽出して並べたいです。

    aaa.csvとbbb.csvを条件で抽出して並べたいです。 $array = file("aaa.csv"); foreach($array as $line){ $line = explode("," , $line); if($line[1] == "0"){ $array = file("bbb.csv"); foreach($array as $item){ $item = explode("," , $item); if($item[2] == $line[0]){ $menu = $item[5]; } } } } aaa.csvの$line[1]が「0」のときbbb.csvの$item[2]と$line[0]が一致するものを表示させたいです。 素人ですいませんが教えてください。

    • 締切済み
    • PHP