在一个数组php中获取多个子字符串匹配

时间:2012-12-03 20:15:48

标签: php regex

我试图找到包含特定子字符串的数组的所有行。

我有一个包含我所有产品编号或SKU的数组。

我有另一个数组,其中包含在目录及其许多子目录中找到的图像路径。

(使用遍历目录的RecursiveIterator填充此图像路径数组,并将所有文件路径添加到此数组中)

每个图像名称都包含其中的SKU,因此sku#123可能包含以下图像:
123.jpg
123_1.jpg
123_2.jpg
等等。

我想输出与特定sku相关联的所有图像。 这是我开始的代码。出于某种原因,我只获得了最后一次sku的预期结果。

$dir = "./images";          // directory with images
$skus = file("./source.csv");   // source file with all skus
$all_images = array();      // array to hold all image paths found in folder

// recursively search through directory save all file paths to array
foreach (new RecursiveIteratorIterator(new RecursiveDirectoryIterator($dir)) as $f) {
 $all_images[] = $f;   
}

// loop through each sku and find its image paths
for($i=0; $i < count($skus); $i++){
    $values = preg_grep("/$skus[$i]/", $all_images);
    echo "----sku: $skus[$i] -----<br /><br />";

    foreach($values as $val)
        echo "Values: $val<br />";  
}

我的结果页面如下所示:

----sku: TR450 -----

----sku: TR451 -----

----sku: TR452 -----

----sku: TR453 -----

----sku: TR454 -----

----sku: TR455 -----

----sku: TR456 -----

Values: ./images\brand\make\TR456 - abacus\TR457.jpg
Values: ./images\brand\make\TR457 - abacus\TR457_Diagram.jpg
Values: ./images\brand\make\TR458 - abacus\Thumbs.db

我不确定为什么这只适用于最后一个SKU?

谢谢。

2 个答案:

答案 0 :(得分:0)

尝试在变量中设置模式并将变量传递给preg_grep

$pattern = '/'. $skus[$i] . '/';
$values = preg_grep($pattern, $all_images);

答案 1 :(得分:0)

我设法通过发现$ skus在它们的末尾都有空格来解决问题。不确定空间是如何进入的,但这导致模式无法被识别!

('sku123 ' != 'sku123')

这是我的代码:

$dir = "./images";              // directory with images
$skus = file("./source.csv");   // source file with all skus
$skus = array_filter(array_map('trim', $skus)); // this is the only new line, 
                                                //it removes white space after the sku
                                                // so the pattern below can actually work.
$all_images = array();      // array to hold all image paths found in folder

// recursively search through directory save all file paths to array
foreach (new RecursiveIteratorIterator(new RecursiveDirectoryIterator($dir)) as $f) {
 $all_images[] = $f;   
}

// loop through each sku and find its image paths
for($i=0; $i < count($skus); $i++){
    $values = preg_grep("/$skus[$i]/", $all_images);
    echo "----sku: $skus[$i] -----<br /><br />";

    foreach($values as $val)
        echo "Values: $val<br />";  
}