如何从foreach循环中将字符串存储到数组中?

时间:2017-12-21 22:12:06

标签: php mysql arrays foreach

首先,我已经在这里阅读了一些问题类似的问题,但我没有采取任何例子并在我的代码中正确实施。我有一个包含几千个数字的数组,它们是目录中文件的名称。我需要运行一个MySQL Query来搜索那些文件名,但是我需要将所有单个查询都放在另一个数组中。

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

$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

所以我的问题是,如何让$files成为一个包含字符串的数组,每个字符串都是包含从$qry搜索第一个值的MySQL Query,以及下一个字符串在$files数组中,将搜索$files中的下一个值。另外,为什么implode();中的第一个少数值与预期的完全不同?

注意:我知道顺序运行一千多个MySQL查询会谋杀我的服务器,我会使用 lua_push*(KEY); lua_push*(VALUE); lua_settable(l, LUA_GLOBALSINDEX); 将它们组合成一个大型查询,我只需要最初想出这个。

1 个答案:

答案 0 :(得分: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";

这将返回所有匹配的项目