如何在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
)