3

正如标题所说,这真的是出于兴趣,我的文件名格式为1347020478_Workbook1 12.19.19.csv- 我想要做的是将时间戳从文件名的开头移开并返回其他所有内容,所以Workbook1 12.19.19.csv

我有以下代码可以正常工作:

$original_filename = explode('_', $list->file);
$timestamp         = array_shift($original_filename);
$original_filename = implode('_', $original_filename);

正如我所说,上面的代码有效,但我想知道是否有更简单的方法?

4

6 回答 6

9

您可以使用stristr()和的组合ltrim()来避免生成数组:

$original_filename = ltrim(stristr($list->file, '_'), '_');

请参阅手册:stristr返回从第一次出现的 needle 到结束的所有 haystack。

于 2012-09-07T15:34:09.657 回答
5

您可以使用字符串函数,例如strpos()substr()

$original_filename = '1347020478_Workbook1 12.19.19.csv';
echo substr( $original_filename, strpos( $original_filename, '_') + 1);
于 2012-09-07T15:35:33.600 回答
4

如果你知道长度是固定的,你可以使用 substr。如果没有,您可以先使用 strpos 。下面给了我 1-2 ms 用于固定长度的“substr”方法,4ms 用于“shift-implode”方法,以及 1-2 ms 用于可变长度“substr”方法。(如果我让数组更大,它会耗尽内存,但你明白了。)

$loops=1000000;

$filename="1347020478_Workbook1 12.19.19.csv"; 
for ($i=0;$i<$loops;$i++){
    $fn[$i]=$filename;
}

$start1=time();
for ($i=0;$i<$loops;$i++){
    $newname=substr($fn[$i],11);    
}
$end1=time();
echo $newname." time=".($end1-$start1)."<br><br>";


$filename="1347020478_Workbook1 12.19.19.csv"; 
for ($i=0;$i<$loops;$i++){
    $fn[$i]=$filename;
}

$start1=time();
for ($i=0;$i<$loops;$i++){
    $original_filename  = explode('_', $fn[$i]);
    $timestamp          = array_shift($original_filename);
    $original_filename  = implode('_', $original_filename);    
}
$end1=time();
echo $original_filename." time=".($end1-$start1)."<br><br>";


$filename="1347020478_Workbook1 12.19.19.csv"; 
for ($i=0;$i<$loops;$i++){
    $fn[$i]=$filename;
}

$start1=time();
for ($i=0;$i<$loops;$i++){
    $st=strpos($fn[$i],"_");
    $newname=substr($fn[$i],$st+1);    
}
$end1=time();
echo $newname." time=".($end1-$start1);
于 2012-09-07T15:53:44.030 回答
4

滥用时间戳将长时间固定长度这一事实,只要您的所有时间戳都位于格林威治标准时间2001 年 9 月 9 日星期日 01:46:40 格林威治标准时间和格林威治标准时间2286 年 11 月 20 日星期六17:46:39 之间,最简单的方法是:

$original_filename = substr($list->file, 11);
于 2012-09-07T15:56:29.273 回答
1

尝试:

preg_replace('/^[0-9]+_/', '', $filename);
于 2012-09-07T15:34:12.290 回答
0

对于您的文件名列表foreach,请执行 aa preg_replace。同样的结果,少了 2 步。

于 2012-09-07T15:33:57.110 回答