[英]Php: How to not replace key in array when same key is found
我正在嘗試解析來自文件的一些“filename.ext”。 這個練習來自 CodinGames,名為“Mime type”。
我應該取每個文件的名稱,查看他的擴展名,並在擴展名數組中找到匹配的鍵 => 值。
例如:對於名為"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
pdf
.pdf
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";
}
}
使用這些語句,您每次都會覆蓋該鍵的值。
$files[$temp[0]] = $temp[1];
$files[$FNAME] = "UNKNOW";
只需使用[]
來追加。
$files[$temp[0]][] = $temp[1];
$files[$FNAME][] = "UNKNOW";
順便說一句,如果有多個擴展,我認為您可以使用它來處理最終擴展
preg_match('/(?<=\.)[^.]+$/', $test, $ext);
您嘗試做的事情對我來說沒有意義,但是您仍然可以通過使用以下內容替換您的內部 if else 塊來實現這一點。
// Verification if extension is know
if ( array_key_exists( $temp[1], $extensions) ){
if(!in_array($temp[0], array_keys($files))){
$files[$temp[0]] = $temp[1];
}
} else {
if(!in_array($temp[0], array_keys($files))){
$files[$temp[0]] = "UNKNOW";
};
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.