如何在PHP数组中查找字符串的子字符串

如何在PHP数组中查找字符串的子字符串,php,search,strpos,Php,Search,Strpos,如果你看看我的许多问题,你会发现有时候我没有问最好的问题,或者我太急了,以至于看不到一直摆在我面前的答案。如果这是其中的另一个问题,请友善一点,因为有些人不是最好的。现在进入问题 在过去的一周左右,我一直在创建一个文件列表查看器类型的东西。在这一点上,这一切都很好,但我需要添加一个搜索功能。我是通过使用数组搜索来实现的。唯一的问题是,此函数要求您输入文件的确切名称,而不是文件的一部分 问题就在这里。我尝试过许多解决方案,坦率地说,我的PHP技能并不是最专业的。我尝试过使用阵列过滤器和strpo循

如果你看看我的许多问题,你会发现有时候我没有问最好的问题,或者我太急了,以至于看不到一直摆在我面前的答案。如果这是其中的另一个问题,请友善一点,因为有些人不是最好的。现在进入问题

在过去的一周左右,我一直在创建一个文件列表查看器类型的东西。在这一点上,这一切都很好,但我需要添加一个搜索功能。我是通过使用数组搜索来实现的。唯一的问题是,此函数要求您输入文件的确切名称,而不是文件的一部分

问题就在这里。我尝试过许多解决方案,坦率地说,我的PHP技能并不是最专业的。我尝试过使用阵列过滤器和strpo循环。在这一点上什么都不起作用。我的代码如下:

<?php
//error_reporting(0);
//ini_set('display_errors', 0);
//$dir = $_SERVER["DOCUMENT_ROOT"] . '/';
$dir = getcwd();
$files = $files = array_slice(scandir($dir), 2);
$number = count($files);
sort($files);
$images = array();
$an = count($images);
$query = $_GET['q'];
$searchimages = array();
$san = count($searchimages);
$r = array();

if ($query) {
    for ($w = 0; $w <= $number; $w++){
        $rnum = count($r);
        if (strpos($files[$w], $query) !== false) {
            $r[$rnum++] = $files[$w];
        }
    }

    if ($r != null) {
        if (substr($files[$r], -5) == ".jpeg" || substr($files[$r], -4) == ".png" || substr($files[$r], -4) == ".jpg" || substr($files[$r], -4) == ".gif") {
            $searchimages[$san++] = $files[$r];
            echo "<a href='#" . $files[$r] . "'>" . $files[$r] . "</a><br>";
        } else {
            echo "<a href='" . $files[$r] . "'>" . $files[$r] . "</a><br>";
        }

        for ($z = 0; $z <= $san; $z++)
        echo "<a name='" . $searchimages[$z] . "'>" . "<a href='" . $searchimages[$z] . "' target='_blank'>" . "<img src='" . $searchimages[$z] . "'>" . "</img></a>";
    } else {
        echo "No results found. Please try a different search" . "<br>";
    }
} else {
    for ($x = 0; $x <= $number; $x++) {
        if (substr($files[$x], -5) == ".jpeg" || substr($files[$x], -4) == ".png" || substr($files[$x], -4) == ".jpg" || substr($files[$x], -4) == ".gif") {
            $images[$an++] = $files[$x];
            echo "<a href='#" . $files[$x] . "'>" . $files[$x] . "</a><br>";
        } else {
            echo "<a href='" . $files[$x] . "'>" . $files[$x] . "</a><br>";
        }
    }

    for ($y = 0; $y <= $an; $y++) {
        echo "<a name='" . $images[$y] . "'>" . "<a href='" . $images[$y] . "' target='_blank'>" . "<img src='" . $images[$y] . "'>" . "</img></a>";
    }
}
?>
然后我检查url中是否提供了搜索参数

?q=insert-search-terms-here
之后,如果提供了,我将搜索它这就是问题所在。如果没有提供,我只需从数组中获取文件名并检查它们是否是图像。如果是,我会以缩略图的形式将它们全部打印在页面底部,并将其顶部的链接设置为页面链接,将您向下滚动到图像的位置。如果它不是一个图像,它会直接将您带到该文件。请注意,缩略图是指向实际图像的链接

当它搜索时应该发生的是,它基本上会做它不搜索时会做的事情,但是它将自己限制在包含字符串foobar的文件中

当它搜索但没有找到任何东西时,它会打印出它没有找到任何东西,并且用户应该再次搜索

如果有人能帮上忙,我们将不胜感激。就像我一开始说的,如果这是一个愚蠢的错误,请仁慈一点

致以最良好的祝愿, 伊曼纽尔

编辑: 这篇文章现在显然有一个答案,对于那些在谷歌上找到这篇文章或你有什么的人,我希望你阅读答案帖子中的评论以及答案,因为它们提供了关键信息

这可能会有帮助

function strafter($string, $substring) {
  $pos = strpos($string, $substring);
  if ($pos === false)
   return $string;
  else 
   return(substr($string, $pos+strlen($substring)));
}
您可能想使用。替换此项:

for ($w = 0; $w <= $number; $w++){
    $rnum = count($r);
    if (strpos($files[$w], $query) !== false) {
        $r[$rnum++] = $files[$w];
    }
}
例如:

$files = array(
    'foo.bar',
    'barfoo.baz',
    'baz.fez',
    'quantum-physics.ftw',
);

$query = 'foo';

$r = preg_grep('/\Q' . $query . '\E/', $files);

print_r($r);
输出:

Array
(
    [0] => foo.bar
    [1] => barfoo.baz
)
下面的preg_匹配可以读取匹配任何以点结尾并后跟jpeg、png、jpg或gif的字符串。美元符号可以转换为字符串的结尾

if ($query) {
    $r = preg_grep('/\Q' . $query . '\E/', $files);

    if ($r != null) {
        foreach($r as $filename) {
            if (preg_match('/\.(jpeg|png|jpg|gif)$/', $filename)) {
                // File is an image
                echo "$filename is an image<br/>";
                // Do stuff ...
            } else {
                // File is not an image
                echo "$filename is NOT an image<br/>";
                // Do stuff ...
            }
        }
        // ... Do more
    } else {
        echo "No results found. Please try a different search" . "<br>";
    }
}

这样的方法甚至适用于关联数组

foreach ($members as  $user){
  $Match = substr($user['column'][0], strpos($user['column'][0], "#") + 1);
  $final_Array[$i]=$Match;
   $i++;
 }

print_r($final_Array)

该函数将返回什么?它会返回找到匹配项的数组的索引吗?编辑:我读了这篇文章,但我认为这不是我需要的。我需要一些东西来返回匹配的索引。谢谢你的回答所有的快乐都是我的:D…嘿嘿。。。奇怪的是,虽然这看起来应该行得通,但它所做的只是向我吐出了很多错误。第28、32和36行上的所有非法偏移或未定义偏移。虽然我不太确定,因为我从一开始就有这样的错误……这是因为您试图使用数组$r作为数组键,就像它是索引一样。即使是,您当前也只检查其中一个搜索结果文件。您可能希望遍历$r数组,一次检查一个文件名值。如果$r!=null{foreach$r作为$filename{如果substr$filename,-5==.jpeg | | |…看看你的代码,我建议你读一点,以便轻松地遍历数组,也许还可以快速进行字符串匹配。你能给我一个关于foreach和preg|u匹配的例子吗?当我把你的preg|u grep放在for循环中时,它有点工作。我发现它是区分大小写的,并且它有时会显示文件,有时只是空白。当它不是空白时,它会多次显示相同的缩略图。
if ($query) {
    $r = preg_grep('/\Q' . $query . '\E/', $files);

    if ($r != null) {
        foreach($r as $filename) {
            if (preg_match('/\.(jpeg|png|jpg|gif)$/', $filename)) {
                // File is an image
                echo "$filename is an image<br/>";
                // Do stuff ...
            } else {
                // File is not an image
                echo "$filename is NOT an image<br/>";
                // Do stuff ...
            }
        }
        // ... Do more
    } else {
        echo "No results found. Please try a different search" . "<br>";
    }
}
foreach ($members as  $user){
  $Match = substr($user['column'][0], strpos($user['column'][0], "#") + 1);
  $final_Array[$i]=$Match;
   $i++;
 }

print_r($final_Array)