正如标题所说的那样,实际上我更感兴趣的是,我的文件名格式为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);
正如我所说,上面的代码有效,但我想知道是否有更简单的方法呢?
答案 0 :(得分:9)
您可以使用stristr()
和ltrim()
的组合来避免生成数组:
$original_filename = ltrim(stristr($list->file, '_'), '_');
参见手册:stristr
返回所有haystack,从第一次出现针头开始到最后。
答案 1 :(得分:5)
$original_filename = '1347020478_Workbook1 12.19.19.csv';
echo substr( $original_filename, strpos( $original_filename, '_') + 1);
答案 2 :(得分:4)
如果你知道长度是固定的,你可以使用substr。如果没有,你可以先使用strpos。以下给出了固定长度“substr”方法1-2毫秒,“shift-implode”方法4毫秒,可变长度“substr”方法1-2毫秒。 (如果我把数组做得更大,它会耗尽内存,但你明白了。)
$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);
答案 3 :(得分:4)
滥用时间戳长时间定长的事实,只要你的所有时间戳都落在太阳之间, 09 Sep 2001 01:46:40 GMT和周六,<强> 2286年11月20日 17:46:39 GMT,最简单的方法是:
$original_filename = substr($list->file, 11);
答案 4 :(得分:1)
尝试:
preg_replace('/^[0-9]+_/', '', $filename);
答案 5 :(得分:0)
要获取文件名列表foreach
,请执行preg_replace
。相同的结果,减少2步。