如何在PHP中从数组中获取相关项的第一个子集?

如何在PHP中从数组中获取相关项的第一个子集?,php,arrays,Php,Arrays,我有一个文件名数组,如下所示: D-CGRS_SS-2000_BLUE.jpg D-CGRS_SS-2000_GREEN.jpg D-CGRS_SS-2000_LIME.jpg D-CGRS_SS-2000_NAVY.jpg D-CGRS_SS-2000_RED.jpg D-CGRS_SS-2000_WHITE.jpg D-CGRS_SS-2000_YELLOW.jpg D-CGRS_SS-2001_BLUE.jpg D-CGRS_SS-2001_GREEN.jpg D-CGRS_SS-2001

我有一个文件名数组,如下所示:

D-CGRS_SS-2000_BLUE.jpg
D-CGRS_SS-2000_GREEN.jpg
D-CGRS_SS-2000_LIME.jpg
D-CGRS_SS-2000_NAVY.jpg
D-CGRS_SS-2000_RED.jpg
D-CGRS_SS-2000_WHITE.jpg
D-CGRS_SS-2000_YELLOW.jpg
D-CGRS_SS-2001_BLUE.jpg
D-CGRS_SS-2001_GREEN.jpg
D-CGRS_SS-2001_LIME.jpg
D-CGRS_SS-2001_NAVY.jpg
D-CGRS_SS-2001_RED.jpg
D-CGRS_SS-2001_WHITE.jpg
D-CGRS_SS-2001_YELLOW.jpg
D-CGRS_SS-2002_BLUE.jpg
D-CGRS_SS-2002_GREEN.jpg
D-CGRS_SS-2002_LIME.jpg
D-CGRS_SS-2002_NAVY.jpg
D-CGRS_SS-2002_RED.jpg
D-CGRS_SS-2002_WHITE.jpg
D-CGRS_SS-2002_YELLOW.jpg
D-CGRS_SS-2003_BLUE.jpg
D-CGRS_SS-2003_GREEN.jpg
D-CGRS_SS-2003_LIME.jpg
D-CGRS_SS-2003_NAVY.jpg
D-CGRS_SS-2003_RED.jpg
D-CGRS_SS-2003_WHITE.jpg
D-CGRS_SS-2003_YELLOW.jpg
.
.
.
将此列表缩减为前七项的最佳方式是什么?那些都有相同的“SS”编号(SS-2000)?因此,生成的数组将是:

D-CGRS_SS-2000_BLUE.jpg
D-CGRS_SS-2000_GREEN.jpg
D-CGRS_SS-2000_LIME.jpg
D-CGRS_SS-2000_NAVY.jpg
D-CGRS_SS-2000_RED.jpg
D-CGRS_SS-2000_WHITE.jpg
D-CGRS_SS-2000_YELLOW.jpg
编辑:

谢谢你的回复。然而,在发布之前,我应该更清楚我的请求。我道歉。以下是一些附加限制:

SS-2000
部分并不总是
SS-2000
。在某些目录中,该系列以
SS-1900
SS-1806
或任何内容开头

此外,我不能保证每组总有7人。有些可能有3个或12个或其他

最后,我不能保证前两位数字将是
SS
,但它将是
SS
HA
,或
NH


在睡了一个好觉并阅读了您的回答之后,我可能想到了一个主意:我可能想在数组的第一个元素上使用
preg_-match
来查找模式
/(SS | HA | NH)-\d{4}/
,然后使用
$matches[0]
结果作为数组上
preg-grep
的模式。(如果可以的话,请随意回复一个简化的正则表达式模式。)

如果您想要的始终是数组中的前七项,请将其用作:

如果要查找以相同前缀开头的所有文件,请使用
foreach
循环:

foreach($originalArray as $item)    
    if (strpos($item, 'D-CGRS_SS-2000') === 0) {
        $res[] = $item;
    }

如果通过前7项,您希望获得具有此前缀的图像
D-CGRS_SS-2000
,并且在数组中的位置无关紧要,那么您可以使用一个模式来匹配这些名称,这些名称将从字符串的开始
^
到结束
$
,并使用
[a-Z]匹配颜色名称+
用于大写字符

例如,如果文件名数组是
$filenames
,则一个选项是使用:

结果

Array
(
    [0] => D-CGRS_SS-2000_BLUE.jpg
    [1] => D-CGRS_SS-2000_GREEN.jpg
    [2] => D-CGRS_SS-2000_LIME.jpg
    [3] => D-CGRS_SS-2000_NAVY.jpg
    [4] => D-CGRS_SS-2000_RED.jpg
    [5] => D-CGRS_SS-2000_WHITE.jpg
    [6] => D-CGRS_SS-2000_YELLOW.jpg
)

我可能想在数组的第一个元素上使用
preg\u match
来查找模式
/(SS | HA | NH)-\d{4}/
,然后使用
$matches[0]
结果作为数组上
preg\u grep
的模式


我今天试了一下,效果不错!感谢所有回答了他们潜在解决方案的人,但这一个解决方案完成了我在原始问题中编辑的所有约束。

使用
array\u filter
和一个过滤器函数,该过滤器函数比较文件名的开头和第一个元素的开头。是否总是前7个元素,或者匹配元素的数量会有所不同吗?数组中后面还会有其他匹配元素吗?他们应该被包括在内,还是你只想要开头的那些?它应该只比较SS号码,还是D-CGRS前缀?他们并不“讨厌”你的问题。它之所以关闭,是因为它不清楚,似乎其他问题已经回答了它。那是在你添加澄清之前。
$filteredFilenames = preg_grep("~^D-CGRS_SS-2000_[A-Z]+\.jpg$~", $filenames);
print_r($filteredFilenames);
Array
(
    [0] => D-CGRS_SS-2000_BLUE.jpg
    [1] => D-CGRS_SS-2000_GREEN.jpg
    [2] => D-CGRS_SS-2000_LIME.jpg
    [3] => D-CGRS_SS-2000_NAVY.jpg
    [4] => D-CGRS_SS-2000_RED.jpg
    [5] => D-CGRS_SS-2000_WHITE.jpg
    [6] => D-CGRS_SS-2000_YELLOW.jpg
)