1

PHP の while ループ内で foreach を実行しようとすると問題が発生します。データベース テーブルからビルド名を抽出しています。これらのビルド名はたまたまフォルダー名です。これらのフォルダー内にはフォルダー (Client または Clients) があり、その中にはクライアントのビジネス名にちなんで名付けられたフォルダーがあります。スクリプトでビルド名を表示し (echo で既に達成されている)、ビルド名の下に各フォルダーを一覧表示する必要があります。

$build_grab = mysql_query("SELECT b_id,b_name FROM builds", $link);
while($build_row = mysql_fetch_array($build_grab))
{
  $b_id = $build_row['b_id'];
  $b_name = $build_row['b_name'];

  $client_dir = is_dir("/somepath/builds/$b_name/Client/");
  $clients_dir = is_dir("/somepath/builds/$b_name/Clients/");

  if ($client_dir == '1') {
    $client_folders = explode(",", exec("ls -1 /somepath/builds/$b_name/Client/"));
  } elseif ($clients_dir == '1') {
    $client_folders = str_replace("\n","", explode(",", exec("ls -1 /somepath/builds/$b_name/Clients/")));
  };

  echo $b_name;
  echo "\r\n";

  foreach($client_folders as $folder)
  {
    echo $folder;
    echo "\r\n";
  }
}

残念ながら、これはビルドごとに 1 つのクライアント フォルダー名しか与えないようで、常にフォルダー内の最後のクライアント (az) です。

出力例:

build-4.0.0.0
Client-f
build-4.0.0.1
Client-d
build-4.0.0.2
Client-j

ここで何が欠けているのか、もっと効率的な方法はありますか? どんな助けでも大歓迎です!

4

4 に答える 4

1

毎回 $client_folders 変数を置き換えています。whileループに入る前に配列として作成したい場合は、これを行います

if ($client_dir == '1') {
  $client_folders[] = explode(",", exec("ls -1 /somepath/builds/$b_name/Client/"));
} elseif ($clients_dir == '1') {
  $client_folders[] = str_replace("\n","", explode(",", exec("ls -1 /somepath/builds/$b_name/Clients/")));
};

ちなみに、これは最初の IF だけに入ります。2 番目はまったく同じだからです。

于 2013-10-18T17:55:26.257 に答える
0

exec()コマンドからの出力の最後の行のみを返します。ディレクトリ リストを読み取るには、ネイティブの PHP 関数を使用する必要があります。/ またはどちらでも機能opendirreaddirますglob

if ($client_dir == '1') {
  $client_folders = glob("/somepath/builds/$b_name/Client/*", GLOB_ONLYDIR);
} elseif ($clients_dir == '1') {
  $client_folders = glob("/somepath/builds/$b_name/Clients/*", GLOB_ONLYDIR);
};
于 2013-10-18T19:31:00.860 に答える
0

使用するのではなく

$client_folders = str_replace("\n","", explode(",", exec("ls -1 /somepath/builds/$b_name/Clients/")));

次のコードを使用してフォルダーを一覧表示することをお勧めします。

if ($folderHandle = opendir(clients_dir)) {
    while ($file = readdir($folderHandle) {
        echo "$file\n";
    }
    closedir($folderHandle);
}

そのコードを条件付きに変更できますが、適切なリストが得られるはずです。

于 2013-10-18T17:59:49.987 に答える
0

mcrumley に感謝します。「glob」を使用するというあなたの提案はそれを修正しました! 申し訳ありませんが、私はどうやらあなたの応答に投票するために初心者にいるようです。おそらく、他のユーザーがそれを手伝ってくれるでしょう。
mysqli を提案してくれた Chris にも感謝します。ここからはそれを使用してコーディングします。

問題を解決した新しいコードの下。

$build_grab = $mysqli->query("SELECT b_id,b_name FROM builds");
  while($build_row = $build_grab->fetch_array())
{
  $b_id = $build_row['b_id'];
  $b_name = $build_row['b_name'];

  $client_dir = is_dir("/somepath/builds/$b_name/Client/");
  $clients_dir = is_dir("/somepath/builds/$b_name/Clients/");

  if ($client_dir == '1') {
    $client_folders = glob("/somepath/builds/$b_name/Client/*", GLOB_ONLYDIR);
  } elseif ($clients_dir == '1') {
    $client_folders = glob("/somepath/builds/$b_name/Clients/*", GLOB_ONLYDIR);
  };

  echo $b_name;
  echo "\r\n";

  foreach($client_folders as $folder)
  {
    echo $folder;
    echo "\r\n";
  }
}

みんなの助けに再び感謝します!

于 2013-10-20T23:57:25.153 に答える