在PHP while循环中,我具有以下内容:
$sql = mysqli_query($conn,"SELECT * FROM stock ORDER BY partnumber");
$productCount = mysqli_num_rows($sql);
if ($productCount > 0) {
while($row = mysqli_fetch_array($sql)){
$id = $row["id"];
$partnumber = $row["partnumber"];
$description = $row["description"];
$price = $row["listprice"];
$availability = $row["availability"];
$image = "path/$partnumber.jpg";
if(!file_exists($image)) { //substitute image if one does not exist
$image = "path/no-image.jpg";
}
在表格中显示图像时,我有:
<a href="product.php?id='.$partnumber.'"><img src="'.$image.'" alt="'.$partnumber.'" /></a>
完全匹配就可以了。 问题是,许多图像在文件名中包含小写的x作为字符通配符。 如何获得这些包含x的图像文件名,以显示其文件名中包含显式字符的部件号?
示例文件名:AB2Dxxx.jpg
零件编号示例:AB2DTUV
答案 0 :(得分:0)
我希望这会有所帮助-我不得不将其调整为在本地运行,但是它使用glob
并假定通配符都在字符串的末尾,因此文件名可以退后直到找到匹配项。
执行路径上有一个名为images
的文件夹,其中将包含我们的理论零件图像。代替数据库,我定义了一个包含测试结果的简单键/值数组(看起来您仅依靠部件号,所以这就是我定义的全部...)。
images
目录包含两个文件:ABCDEF.jpg
和ABCxxx.jpg
。
$parts = array( array( "partnumber"=> "ABCDEF" ),
array( "partnumber"=> "ABDCEF" ),
array( "partnumber"=> "ABCDDD" ) );
foreach($parts as $part) {
$partnumber = $part["partnumber"];
$next_pn = $partnumber;
$pn_len = strlen($partnumber);
echo $partnumber." is the part number<br>-------------<br>";
while(strlen($next_pn) > 0 )
{
$image = null;
foreach (glob("images/".$partnumber."*.jpg", GLOB_NOSORT) as $filename) {
$image = $filename;
echo $filename . " matches " . $partnumber."<br>";
}
if($image) {
echo "<br>";
break;
}
$next_pn = substr($next_pn, 0, -1);
$partnumber = str_pad($next_pn, $pn_len, "x");
}
}
此输出
ABCDEF is the part number
-------------
images/ABCDEF.jpg matches ABCDEF
ABDCEF is the part number
-------------
ABCDDD is the part number
-------------
images/ABCxxx.jpg matches ABCxxx
如您所见,它基本上将采用文件名并检查是否匹配-如果未找到匹配项,它将删除一个字符并将其替换为x
,然后再次进行检查。在这种情况下:
ABCDEF立即匹配ABCDEF.jpg
;
ABDCEF与任何文件都不匹配,并且;
ABCDDD在第四个循环上匹配ABCxxx.jpg
(第一个检查ABCDDD
,第二个ABCDDx
,第三个ABCDxx
,第ABCxxx
个匹配)
它并不完美,可能需要更多的工作,但似乎可以完成您想要的工作。
P.S。 glob
有很多选择-我已经使用NOSORT
作为标志,当有很多文件要搜寻时,它倾向于帮助它更快地运行。
http://php.net/manual/en/function.glob.php