PHP:foreach inside while while循环只返回一个结果

时间:2013-10-18 17:49:46

标签: php mysql foreach while-loop

尝试在PHP中的while循环中执行foreach时出现问题。我正在从数据库表中提取构建名称。这些构建名称恰好是文件夹名称。在这些文件夹中是一个文件夹(客户端或客户端),在这些文件夹中是以客户端企业名称命名的文件夹。我希望脚本向我显示构建名称(已经使用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)个客户端文件夹名称,它始终是文件夹中的最后一个客户端(a-z)。

示例输出:

  

集结4.0.0.0
客户-F
集结4.0.0.1
客户d
集结4.0.0.2
客户-J

我在这里或更好的地方缺少什么,是否有更有效的方法来做到这一点?非常感谢任何帮助!

4 个答案:

答案 0 :(得分: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,因为第二个是完全相同的

答案 1 :(得分: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);
}

您可以将该代码更改为有条件的,但它应该为您提供一个好的列表。

答案 2 :(得分:0)

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

答案 3 :(得分:0)

非常感谢mcrumley,你建议使用'glob'修复它!对不起crumley,我显然是想对你的回复进行投票。也许其他用户可以提供帮助。
还要感谢克里斯建议使用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";
  }
}

再次感谢大家的帮助!