为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

PHP
斯蒂芬大帝 2022-10-22 15:58:22
我正在尝试解析来自文件的许多“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";    }}
查看完整描述

2 回答

?
慕桂英546537

TA贡献1848条经验 获得超10个赞

使用这些语句,您将每次都覆盖该键的值。


$files[$temp[0]] = $temp[1];

$files[$FNAME] = "UNKNOW";

只需使用[]to append 代替。


$files[$temp[0]][] = $temp[1];

$files[$FNAME][] = "UNKNOW";

顺便说一句,如果有多个扩展,我认为您可以使用它来处理最终扩展


preg_match('/(?<=\.)[^.]+$/', $test, $ext);


查看完整回答
反对 回复 2022-10-22
?
PIPIONE

TA贡献1829条经验 获得超9个赞

你试图做的事情对我来说没有意义,但你仍然可以通过用以下替换你的内部 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";   

    };

}


查看完整回答
反对 回复 2022-10-22
  • 2 回答
  • 0 关注
  • 131 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号