3

我有一个带有文件名的数组。

我想检查数组是否有扩展名为“.txt”的文件。

我怎样才能做到这一点?

in_array仅检查特定值。

4

7 回答 7

4

试试array_filter。在回调中,检查.txt扩展是否存在。

如果array_filter有条目的结果(真实),那么您可以获得第一个或所有条目。如果数组为空,则没有匹配项。

于 2012-12-19T16:20:06.687 回答
3

您可以遍历数组中的项目,然后对每个项目执行正则表达式或 strpos 匹配。找到匹配项后,您可以返回 true。

strpos()

$array = array('one.php', 'two.txt');

$match = false;
foreach ($array as $filename) {
    if (strpos($filename, '.txt') !== FALSE) {
        $match = true;
        break;
    }
}

使用正则表达式:

$array = array('one.php', 'two.txt');

$match = false;
foreach ($array as $filename) {
    if (preg_match('/\.txt$/', $filename)) {
        $match = true;
        break;
    }
}

两者都将导致$match等于true

于 2012-12-19T16:19:56.173 回答
1
$files = array('foo.txt', 'bar.txt', 'nope.php', ...);

$txtFiles = array_filter($files, function ($item) {
    return '.txt' === substr($item, -4); // assuming that your string ends with '.txt' otherwise you need something like strpos or preg_match
});

var_dump($txtFiles); // >> Array ( [0] => 'foo.txt', [1] => 'bar.txt' )

array_filter函数循环遍历数组并将值传递给回调。如果回调返回 true,它将保留该值,否则它将从数组中删除该值。在回调中传递所有项目后,返回结果数组。


哦,你只想知道是否.txt在数组中。其他一些建议:

$match = false;

array_map(function ($item) use ($match) {
    if ('.txt' === substr($match, -4)) {
        $match = true;
    }
}, $filesArray);
$match = false;
if (false === strpos(implode(' ', $filesArray), '.txt')) {
    $match = true;
}
于 2012-12-19T16:20:42.143 回答
0

使用以下文件扩展名过滤数组结果array_filter

// Our array to be filtered
$files = array("puppies.txt", "kittens.pdf", "turtles.txt");

// array_filter takes an array, and a callable function
$result = array_filter($files, function ($value) {
    // Function is called once per array value
    // Return true to keep item, false to filter out of results
    return preg_match("/\.txt$/", $value);
});

// Output filtered values
var_dump($result);

结果如下:

array(2) {
  [0]=> string(11) "puppies.txt"
  [2]=> string(11) "turtles.txt"
}

执行它:http: //goo.gl/F3oJr

于 2012-12-19T16:45:16.750 回答
0
$iHaz = FALSE;

foreach ($arr as $item) {
    if (preg_match('/\.txt$/', $item)) {
        $iHaz = TRUE;
        break;
    }
}

与其他答案相反array_filter,我不返回任何东西。我只是检查它是否存在于数组中。此外,这种实现比array_filter一旦找到东西就跳出循环更有效。

于 2012-12-19T16:22:26.200 回答
0

由于您正在处理您应该使用的文件,array_filter并且pathinfo

$files = array_filter(array("a.php","b.txt","z.ftxt"), function ($item) {
    return pathinfo($item, PATHINFO_EXTENSION) === "txt";
});

var_dump($files); // b.txt
于 2012-12-19T16:34:27.567 回答
0

如果您想要一个仅包含以 结尾的字符串的过滤数组.txt,那么 PHP8 为您提供了一个原生函数。

代码:(演示

$array = ['one.php', 'two.txt'];

var_export(
    array_filter(
        $array,
        fn($v) => str_ends_with($v, '.txt')
    )
);

如果您想要一个真/假结果并且不需要迭代整个数组,那么有条件break地循环。(演示

$found = false;
foreach ($array as $filename) {
    if (str_ends_with($filename, '.txt')) {
        $found = true;
        break;
    }
}
var_export($found);
于 2022-01-22T07:56:59.080 回答