PHP:找到相同的键时如何不替换数组中的键

我正在尝试解析来自文件的许多“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

          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";

    }

}


斯蒂芬大帝
浏览 132回答 2
2回答

慕桂英546537

使用这些语句,您将每次都覆盖该键的值。$files[$temp[0]] = $temp[1];$files[$FNAME] = "UNKNOW";只需使用[]to append 代替。$files[$temp[0]][] = $temp[1];$files[$FNAME][] = "UNKNOW";顺便说一句,如果有多个扩展,我认为您可以使用它来处理最终扩展preg_match('/(?<=\.)[^.]+$/', $test, $ext);

PIPIONE

你试图做的事情对我来说没有意义,但你仍然可以通过用以下替换你的内部 if else 块来实现这一点。// Verification if extension is knowif ( array_key_exists( $temp[1], $extensions) ){&nbsp; &nbsp; if(!in_array($temp[0], array_keys($files))){&nbsp; &nbsp; &nbsp; &nbsp; $files[$temp[0]] = $temp[1];&nbsp; &nbsp;&nbsp; &nbsp; }} else {&nbsp; &nbsp; if(!in_array($temp[0], array_keys($files))){&nbsp; &nbsp; &nbsp; &nbsp; $files[$temp[0]] = "UNKNOW";&nbsp; &nbsp;&nbsp; &nbsp; };}
打开App,查看更多内容
随时随地看视频慕课网APP