我正在尝试解析来自文件的许多“filename.ext”。这个练习来自 CodinGames,名为“Mime type”。
我应该取每个文件的名称,查看他的扩展名,并在 extensions 数组中找到匹配的 key => value。
例如:对于名为"foobar.pdf"的文件,我查看是否有一个点,如果是,我将名称拆分到文件数组 [foobar => pdf]中。如果没有像 "foobar" 这样的点,它就会变成[foobar => Unknown]。最后一个案例被问到,如果有两个点,“foo.bar.pdf”就像[foo.bar => pdf]一样推动,但我不适合那种情况。
我的问题是我的第一个文件名是“a”,没有点没有扩展名。所以代码运行并且做得很好。它以文件数组 [a => Unknown] 中的完美输入结束。但是现在,第二个文件名是“a.wav”。并且程序会将 [a => Unknown] 的值替换为 [a => wav] 因为它是相同的键。
那么我们怎样才能避免这些替换呢?我在网上搜索,但每个人都在搜索替换键值,而不是创建一个新值。
编辑:我期望在我的文件数组中有 2 个不同的输入。在这种情况下,我想要:$files = [ [a => Unknow], [a => wav], ... ]。在此之后,我必须为每个文件输出来自 extensions 数组的每个 mime 类型,因此按顺序:“Uknown”,“audio/x-wav”,...这就是为什么我必须保留第一个键,因为没有扩展名很高兴知道。
$FNAME = "a
a.wav
b.wav.tmp
test.vmp3
mp3
report..pdf
defaultwav
.mp3.
final.";
有我的代码:
$N = 4 // Number of extensions
$Q = 11 // Number of files to parse
$extensions = [
[wav] => audio/x-wav
[mp3] => audio/mpeg
[pdf] => application/pdf
[UNKNOW] => UNKNOWN
];
$files = [];
for ($i = 0; $i < $Q; $i++){
// Input / One file name per line.
$FNAME = stream_get_line(STDIN, 256 + 1, "\n");
// --- TRANSFORM STRING INTO KEY => VALUE ---
// If there is 2 dots e.g "file.name.ext"
if (preg_match('/\..*\./',$FNAME)){
// Do something e.g split string at the second dot, I don't know for the moment how to do this
// I tried regex option U but something wrong happen;
}
// If there is one dot in "filename.ext"
elseif ( preg_match("/\./",$FNAME) ){
$temp = preg_split ("/\./", $FNAME);
// Verification if extension is know
if ( array_key_exists( $temp[1], $extensions) ){
$files[$temp[0]] = $temp[1];
} else {
$files[$temp[0]] = "UNKNOW";
}
} else {
$files[$FNAME] = "UNKNOW";
}
}
斯蒂芬大帝
慕桂英546537
PIPIONE
随时随地看视频慕课网APP