【问题标题】:How to store strings into an array from a foreach loop?如何将字符串从 foreach 循环存储到数组中?
【发布时间】:2017-12-21 22:12:05
【问题描述】:

首先,我在这里阅读了一些提出类似问题的问题,但没有任何可以作为示例并正确实施到我的代码中的问题。我有一个包含几千个数字的数组,它们是目录中文件的名称。我需要运行一个 MySQL 查询来搜索这些文件名,但我需要将所有单独的查询放在另一个数组中。

这是我获取文件名的代码:

$dir = "C:/Users/EyeCandy-Brian/Desktop/jobs";

$files = array_diff(scandir($dir), array('..', '.'));

function truncate(&$fcn) {
     $fcn = substr($fcn, 0, 6); // The original is '100100.dat', I only need the number
};

array_walk($files, "truncate");

数组如下所示:

2 => string '100100'
3 => string '100101'
4 => string '100102'
5 => string '100103'
// About 1,500+ Total

这是我声明的变量的 foreach 循环:

$limit = 0; // This is for testing, stops after 5 iterations.
$qryArrNum = 2; // The index for the $files array, [0] & [1] were '.' & '..'
$count = 0; // Which index I want to store the string in, starting at [0]

$qry = array(); // I declare $qry as an array

foreach ($files as &$qry) {
    $qry[$count++] = "SELECT * FROM `table` WHERE `sku` LIKE '%$files[$qryArrNum]%'";
    ++$qryArrNum;
    if (++$limit == 5) {
        break;
    };
};

这就是它变得疯狂的地方。使用var_dump($qry); 时,我得到'1001S4',这是不应该的。运行var_dump($files);数组的前五个字符串是:

2 => string 'S00100'
3 => string '1S0101'
4 => string '10S102'
5 => string '100S03'
6 => string '1001S4'

然后是来自文件名的预期字符串:

7 => string '100105'
8 => string '100106'
9 => string '100107'
// On for 1,500+ again

所以我的问题是,我如何让$qry 成为一个包含字符串的数组,每个字符串都是 MySQL 查询,其中包含从 $files 中搜索第一个值,以及 @987654331 中的下一个字符串@array 将从$files 中搜索下一个值。另外,为什么$files 中的前几个值与预期的完全不同?

注意:我知道按顺序运行一千多个 MySQL 查询会毁掉我的服务器,我将使用 implode(); 将它们组合成一个大查询,我只需要一开始就弄清楚这一点.

【问题讨论】:

  • 您在外部有一个变量 ($qry),它在 foreach 值中是相同的。为什么?
  • foreach ($files as &$qry) 是什么让你搞砸了。将其更改为foreach ($files as $file) 然后您可以使用$qry[$file] = "SELECT * FROM...
  • 你似乎在这里把事情复杂化了。
  • 另外,$qry[$count++] = 如果你要去 0、1、2、3、4 等,那也没什么意义,只需使用 $qry[] = ,索引会自动以数字递增。
  • @Scuzzy 哦,我的天哪,我发誓我已经读了一百万遍了,我觉得还不错,我需要更多的咖啡。非常感谢。我最初尝试了$qry[],但它抛出了一个错误,我猜这是由于$files as $qry 部分不正确。

标签: php mysql arrays foreach


【解决方案1】:

您可以使用 mysql find_in_set(),而不是运行多个查询。 https://dev.mysql.com/doc/refman/5.7/en/string-functions.html#function_find-in-set 获得文件后,使用 implode 转换为字符串

$tmp = implode(",",$files);

你的 sql 语句是:

$sql = "SELECT * FROM `table` WHERE FIND_IN_SET(`sku`,'{$tmp}')>0";

这将返回所有匹配项

【讨论】:

  • 如果我正确读取 OP 代码,他似乎也想在 5 次查询后跳出循环。如果是这样,也许将 LIMIT 5 添加到 SQL 查询中?
  • @CMiller 变量$limit 严格用于测试目的,在 WAMP 中我让它停在 5,所以我不必永远等待循环迭代数千次。当我实现查询的内爆并将其推送时,它将被删除,不过谢谢!
猜你喜欢
  • 2015-08-29
  • 1970-01-01
  • 2014-09-02
  • 1970-01-01
  • 2011-03-04
  • 1970-01-01
  • 2016-06-09
  • 1970-01-01
  • 2019-11-23
相关资源
最近更新 更多