簡體   English   中英

PHP:foreach內部while循環僅返回一個結果

[英]PHP: foreach inside while loop returning only one result

嘗試在PHP的while循環內執行foreach時遇到問題。 我正在從數據庫表中提取內部版本名稱。 這些內部版本名稱恰好是文件夾名稱。 在這些文件夾中是一個文件夾(“客戶端”或“客戶端”),而這些文件夾中是以客戶端公司名稱命名的文件夾。 我希望腳本向我顯示構建名稱(已經用回顯完成),然后在構建名稱下方列出每個文件夾。

$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)。

示例輸出:

建立-4.0.0.0
客戶-F
建立-4.0.0.1
客戶d
建立-4.0.0.2
客戶-J

我在這里想念的還是更好的,有沒有更有效的方法? 任何幫助是極大的贊賞!

您每次都要替換$ 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,因為第二個完全相同

而不是使用

$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);
}

您可以將該代碼更改為有條件的,但它應該為您提供良好的清單。

exec()僅返回命令輸出的最后一行。 您應該使用本機PHP函數讀取目錄列表opendir / readdirglob將起作用。

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);
};

非常感謝mcrumley,您使用'glob'的建議已將其修復! 抱歉,我很顯然是要newb投票支持您的答復。 也許其他用戶可以幫助您。
也感謝克里斯建議的mysqli,我將從這里開始進行編碼,在這里較晚采用。

在解決問題的新代碼下面。

$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";
  }
}

再次感謝大家的幫助!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM