2017-01-10 100 views
0

我试图获得真值值,但结果总是显示false,该如何解决这种情况?检查值存在于具有相同键值的数组中

$allow = array(
    "pdf"=>"application/pdf", 
    "doc"=>"application/msword", 
    "docx"=>"application/vnd.openxmlformats-officedocument.wordprocessingml.document", 
    "docx"=>"application/zip" 
); 

if (in_array("application/vnd.openxmlformats-officedocument.wordprocessingml.document",$allow)) { 
    echo "true"; 
} else { 
    echo "false"; 
} 

在这种情况下,我有两个* .docx文件,但MIME类型是不同的,如何让他们两个???

+3

你不能定义与相同密钥的两个数组元素,如果使用相同的密钥两个数组元素则最新的一个覆写以前 –

+0

我有不同的MIME两种文件DOCX,如何让他们两个? –

+0

@AbuAyyub:docx1,docx2 ?? –

回答

1

这可能会帮助你请尝试下面的解决方案。您可以将docx作为一个关键值,并将逗号分隔为逗号。

$allow = array(
    "pdf" => "application/pdf", 
    "doc" => "application/msword", 
    "docx" => "application/vnd.openxmlformats-officedocument.wordprocessingml.document", "application/zip", 
); 

$allownew = array_values($allow); 


if (in_array("application/vnd.openxmlformats-officedocument.wordprocessingml.document", $allownew)) 
{ 
    echo "true"; 
} 
else 
{ 
    echo "false"; 
} 
+0

非常不好的做法。使用*** array_values ***代替foreach循环。仍然不是推荐的方式。 ***使用索引数组代替*** –

+0

Ravi hirani - 你的解决方案是不好的做法伙计.. – craig

+0

@AbuAyyub - 欢迎兄弟.. – craig

0

检查数组

$allow = array(
    "pdf"=>"application/pdf", 
    "doc"=>"application/msword", 
    "docx"=>"application/vnd.openxmlformats-officedocument.wordprocessingml.document", 
    "docx"=>"application/zip" // this will be overridden by above index. 
); 

    if(in_array("application/vnd.openxmlformats-officedocument.wordprocessingml.document",$allow)){ 
    echo "true"; 
    }else{ 
    echo "false"; 
    } 

你的阵列具有相同的密钥,DOCX,所以最后一个会被旧的覆盖。

在你的情况

"application/vnd.openxmlformats-officedocument.wordprocessingml.document", 
overriden by "application/zip" 

编辑

$allow = [ 
"pdf"=>"application/pdf", 
"doc"=>"application/msword", 
"docx"=>[ 
     "docx"=>"application/zip", 
     "application/vnd.openxmlformats-officedocument.wordprocessingml.document"] 
]; 

而且条件会。

function in_array_r($needle, $haystack, $strict = false) { 
    foreach ($haystack as $item) { 
     if (($strict ? $item === $needle : $item == $needle) || (is_array($item) && in_array_r($needle, $item, $strict))) { 
      return true; 
     } 
    } 

    return false; 
} 

echo in_array_r("application/vnd.openxmlformats-officedocument.wordprocessingml.document", $allow) ? 'true' : 'false'; 

我参考了link

+0

我有两个文件* .docx与不同的哑剧,如何让他们两个? –

+0

检查我的编辑部分 – rahulsm

2

问题是该数组包含两个具有相同键的项目。即,"application/zip"优先于"application/vnd.openxmlformats-officedocument.wordprocessingml.document"。以下是print_r($allow);输出:

Array 
(
    [pdf] => application/pdf 
    [doc] => application/msword 
    [docx] => application/zip 
) 

所以,你应该application/zip指定不同的密钥,例如:

$allow = array("pdf" => "application/pdf", 
    "doc" => "application/msword", 
    "docx" => "application/vnd.openxmlformats-officedocument.wordprocessingml.document", 
    "zip" => "application/zip" 
); 
+0

我有两个文件与不同的哑剧文件,如何让他们两个? –

+0

@AbuAyyub,只需使用不同的键为阵列项目 –

1

我可以看到keys没有你的情况很重要。 您可以使用indexed array而不是multidimensional array

$allow = array("application/pdf", 
       "application/msword", 
       "application/vnd.openxmlformats-officedocument.wordprocessingml.document", 
       "application/zip"); 

如果你真的想使用多维数组然后,

使用不同的密钥两个默剧,如docx1, docx2

$allow = array(
    "pdf"=>"application/pdf", 
    "doc"=>"application/msword", 
    "docx1"=>"application/vnd.openxmlformats-officedocument.wordprocessingml.document", 
    "docx2"=>"application/zip" 
); 
1

也许你应该与该阵列的“翻转”的版本试试吧:现在

$allow = array(
    "application/pdf"=>"pdf", 
    "application/msword"=>"doc", 
    "application/vnd.openxmlformats-officedocument.wordprocessingml.document"=>"docx", 
    "application/zip"=>"docx" 
); 

,当然,你需要搜索该阵列的钥匙,而不是像

$k="application/vnd.openxmlformats-officedocument.wordprocessingml.document"; 
If (array_key_exists($k,$array)) echo $array[$k]; // docx 
+0

其实,我认为这种方法... –

相关问题