配列から重複を取り除き、データを取得する方法

このQ&Aのポイント
  • 配列内のデータとファイル名を比較し、重複がない場合はデータを取得します。
  • 回避策として、foreachループを使用して配列の整合性を保ちつつ重複を取り除く方法も検討できます。
  • また、配列内のデータを検証して重複を取り除く方法もありますが、整合性が崩れる可能性があるため注意が必要です。
回答を見る
  • ベストアンサー

配列どうしで同じ値があれば取り除きたいのですが

ディレクトリtest内に存在するファイル名(例えば、file1、file2、....)を調べ、 同じものが存在しなければある場所からcURLにてデータを取得、という事をしようと考えております。 ここでは前もって$namesにその取得しようとしているデータ名が配列にて入っているとします。 そこでManualにあった通り、(簡略化していますが)以下のように書いたのですが、 この方法では、 1. $entry、つまり存在するファイルの数だけwhile()によって回されその度にget_text()が呼ばれて重複してしまう 2. $entryによってwhile()で回されている際、$entry=file1の時はfile1は取得されないが、 このwhile()の際に存在するはずのfile2まで取得プロセスが働くことになる 、と思います。 このような場合、どのようなスクリプトを書けば宜しいのでしょうか? アドバイスを頂ければと思います。 宜しくお願い致します。 define('DS', DIRECTORY_SEPARATOR); //簡易的なため$urlsは$names[$d]に沿ったurl情報を格納しているとします if ($handle = opendir($directory_path)) { $d = 0; while (false !== ($entry = readdir($handle))) { if ($entry != "." && $entry != "..") { if (!file_exists($directory_path . DS . $names[$d] . ".txt")) //またはif($entry == $directory_path . DS . $names[$d] . ".txt") { $text = get_text($urls); //<-存在しないテキストを新たに取得するcURL自己関数 } } } $d++; } closedir($handle); $names内のデータ名と、test内のファイル名を検証し、同じものがあれば配列$names内から削除 というような事も考えましたが、 foreach()にて$namesないから削除していくやり方では、一般配列の整合性が崩れ foreach()の繰り返し番号によっては消えない場合もあるのではないかと思い、分かりませんでした。

  • PHP
  • 回答数1
  • ありがとう数1

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

  • ベストアンサー
  • shimix
  • ベストアンサー率54% (865/1590)
回答No.1

ディレクトリから取得するファイル名と$nameの関係がよくわかりませんし、突然出てくる$urlsや何も使われていない$textの意味がわかりませんが(汗 $files = glob(($directory_path . DS . '*.txt'); $wname = array(); foreach ($names as $val) { $wname[] = $directory_path . DS . $val . ".txt"; } $diff = array_diff($files, $wname); とすれば、$diffに「存在しないファイル名」だけ取得できるのではありませんか?

chopperin
質問者

お礼

ご回答ありがとうございました。 つぎはぎだらけのスクリプトな上、説明が分かりにくくて申し訳ございませんでした。 自分なりに工夫をして、array_diff()使って出来ました。 ありがとうございました。

関連するQ&A

  • CSVからの抽出、並び替えのプログラム

    すいません。phpを勉強し始めたばかりで、CSVから抽出したものを並び替えたいと考えていまして、 サンプルプログラムをいくつか見ていたのですが一部よく分からない所があります。 例えば以下のプログラムで $names = Array(); と$names[] = $lines[0]; はどのような処理をしているのでしょうか? ただ単にCSVから読み込み→配列を全部表示では上記の処理は見当たりません。 斉藤一郎,170,60,A 鈴木二郎,180,90,B 田中三郎,190,80,O 中村四郎,160,100,AB <?php if( $handle = fopen( 'test.csv', 'r' ) ){ $names = Array(); // while( ( $lines = fgetcsv( $handle ) ) !== FALSE ){ if( $lines[2] >= 90 ){ //体重が90以上なら $names[] = $lines[0]; // } } echo '体重が90kg以上なのは、' . implode( '・', $names ) . 'です'; } ?>

    • ベストアンサー
    • PHP
  • Swiftについて教えてください

    swiftとphpの連携を考えています。 1.Objective-Cから、PHPファイルに同期通信 2.phpファイル内で配列を生成し、パスを代入していく 3.phpの配列をswiftの配列に取り込む としたいのですが、phpの配列をswiftの配列に渡す部分がどうしたらいいのか分かりません。 phpもswiftも初心者です。同期通信の部分もよく分かってないです。具体的に詳しく教えていただけるとありがたいです。よろしくお願いします。 swift----------------------------------------------------------------------------- // URLリクエストを作る let url = NSURL(string:"http://xxxxxxxxxxxx/xxxxx/xxx.php") let request = NSURLRequest(URL : url!) var error: NSError? // 同期通信を開始 if let resData:NSData = NSURLConnection.sendSynchronousRequest(request, returningResponse: nil, error: &error){     この部分で何かするのでしょうか? } xxx.php------------------------------------------------------------------ <?php //配列 $array = array();   // ディレクトリのパスを記述 $dir = "xxxxxxxxx/" ; // ディレクトリの存在を確認し、ハンドルを取得 if( is_dir( $dir ) && $handle = opendir( $dir ) ) { // ループ処理 while( ($file = readdir($handle)) !== false ) { // ファイルのみ取得 if( filetype( $path = $dir . $file ) == "file" ) { $urltxt = " http://xxxxxxxxxxxxxxxxxx/" . $path ; array_push($array, $urltxt); } } } ?>

    • ベストアンサー
    • Swift
  • ファイル名を取得できない

    次のようなソースでディレクトリ内のファイル名を取得しようとしています。 $dh=opendir("."); while(($entry=readdir($dh))){ if(is_file($entry)){ print $entry."<>"; } } closedir($dh); このソースを、取得したいディレクトリ内で動かすとまったく問題ないのですが、ディレクトリのパスを1個上の階層などから相対パスで指定すると、.phpファイルと.htmlファイルは取得するのですが、ほかのファイル名は取得されなくなってしまいます。 何かphp.iniなどで設定があるのでしょうか。 回避方法がありましたら是非ご教授ください。 よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • 3次元配列を2次元配列にする方法はありますか?

    3次元配列を2次元配列にする方法はありますか? すいません、初心者です。 オープンソースとyahooとgoogleのAPIを使って統合型メタ検索エンジンを作っています。 yahooの結果の配列は2次元配列で出せました。 $search_results[$i]["url"] google APIは1回のリクエストで8件までしか呼び出せないみたいなので、 curl_multi関数を使って複数のリクエストを同時に取得しています。 そうしたら結果の配列は三次元配列になりました。 $search_results[$id][$i]["url"] 以下googleの関数です。curl_multiの部分等、文字数の関係で省略しています。 省略した部分のソースは下記リンクにのっています。 http://phpspot.org/blog/archives/2008/02/phpapi.html function search_google($query) { $curls = array(); $search_results = array(); $i=0; $site_results = array( 'http://ajax.googleapis.com/&start=0', 'http://ajax.googleapis.com/&start=8', 'http://ajax.googleapis.com/&start=16', 'http://ajax.googleapis.com/&start=24', 'http://ajax.googleapis.com/&start=32', 'http://ajax.googleapis.com/&start=40', 'http://ajax.googleapis.com/&start=48', 'http://ajax.googleapis.com/&start=56'); foreach($curls as $id=>$c) { $searchs[$id] = curl_multi_getcontent($c);//$cが$site_resultsのリクエスト結果 curl_multi_remove_handle($mh, $c); $json=json_decode($searchs[$id]); if($json->responseStatus != 200){exit();} $responseData = $json->responseData; $results = $responseData->results; for($i=0;$i<count($results);$i++){ $title = $current_result->title; $search_results[$id][$i]["title"]= $title; } } curl_multi_close($mh); return $search_results; } 統合型メタ検索にしたいと考えているのでgoogle配列の変数[$id]同士を結合して yahooの結果と同じく $search_results[$i]["url"] のような二次元配列にしたいのですが、そのようなことは可能ですか? 本当は両方とも3次元配列にするという処理が適切だと思いますが、初心者がオープンソースを改良して使用しているので、どこを直せば3次元配列のものをうまく表示できるのかわからないのです。 わかりにくかったらすいません。どうか、よろしくお願いします。

    • ベストアンサー
    • PHP
  • 限られた数の配列のみ表示させる

    配列の基本的なことを理解していないので、極めて初歩的な質問で申し訳ありませんが、ご教示お願い致します。 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
  • phpでディレクトリにあるファイル数を知るには?

    こんにちわ, 今phpであるディレクトリ以下のファイルをすべて,リスト(select)で表示したいのですが,そのフォルダにいくつファイルがあるかを知りたいのです。 $d = dir("/HOGEHOGE"); echo "<select name=\"file\" size=??? multiple>"; while($entry=$d->read()) {   echo "<option value=\"$entry\">$entry"; } $d->close(); 上記のことで???にそのファイルを入れることができれば,それができると思うのですが,何かいい方法,またはそのようなファイル数を知る「ls|wc -w」のような方法があれば教えてください。 よろしくお願いします。

    • ベストアンサー
    • PHP
  • フォルダ内のファイル名を取得して配列にぶち込みたいです

    こんにちは。 フォルダ内ファイル名を一覧にして表示させることまでは出来ますが、 この一覧表示されたファイル名を配列に入れるにはどうしたらよいでしょうか。 <?php $dir = "sample/"; // ディレクトリの内容を読み込みます。 if ($dh = opendir($dir)) { while (($file = readdir($dh)) !== false) { echo "filename: " . $file . "<br />\n"; } closedir($dh); } ?> ご教示宜しくお願い致します。

    • ベストアンサー
    • PHP
  • ファイルを読み込み一部を書き換え

    ファイルを読み込み一部を書き換えたいです。 a.phpを読み込み$newという配列渡し、abcという文字があったら $dataのbbbに書き換えたいのですうまくいきません。 $data = "bbb"; $handle = @fopen("a.php", "r+"); if ($handle) { while (!feof($handle)) { $buffer = fgets($handle, 4096); $new = ereg_replace("abc", $data, $new); fwrite($fp,$new); } } fclose($handle); 助言お願いします。

    • ベストアンサー
    • PHP
  • 配列にしたいのですが

    int i,j=0,work=0; int D[]={376,251,240,115}; int A[]={1,2,4,7,13,24,44,81,149,274}; do{ for(i=9;i>=0;i--){ work=D[j]-A[i]; if(work>=0){ D[j]=work; printf("%2d",i); } } printf("\n"); j++; }while(j<=3); これにより、出力 9 7 4 3 0 8 7 4 3 0 8 7 3 1 0 7 5 3 1 0 を得たのですが、これを int e[4][5]={{9,7,4,3,0},{8,7,4,3,0},{8,7,3,1,0},{7,5,3,1,0}}; となるように配列したいのですが、上記のプログラムをどのようにすればいいのでしょうか。

  • 同一ディレクトリの連番ファイルの一番大きな数字のものをindex.phpに表示する

    お手上げで、困っています。 ご教教授いただければ幸いです。 現在、以下のような連番のファイルとindex.phpが1つのディレクトリに格納されている状態で、 この中から、数字の一番大きなものをphpで表示させたいのですが、 どうすれば良いか、ご教授お願い致します。 index.php 01.jpg 02.jpg 03.jpg 04.jpg 05.jpg 06.jpg 07.jpg 08.jpg 09.jpg 10.jpg . . . more 今の状態は、ディレクトリ内のファイルを見るまでです。 その先がお手上げ状態です。 <?php define("dirfile", "."); header("Content-Type: text/plain; charset=utf-8"); $handle = opendir(dirfile); while (($entry = readdir($handle))) { if(is_file(dirfile . "/" . $entry)) { echo $entry . "\n"; } } closedir($handle); ?> よろしくお願い致します。

    • ベストアンサー
    • PHP

専門家に質問してみよう