簡體   English   中英

Php:找到相同的鍵時如何不替換數組中的鍵

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM