PHP数组从数组中搜索

时间:2017-08-26 15:12:40

标签: php arrays

好吧,像往常一样,我不擅长在标题中解释我想要的东西,这就是我的问题:

我有这个数组(最终不起作用,并给出非法的偏移类型错误。

protected $files = [
     ['jpeg','bmp']  =>  'images',
     ['mp4','avi']   =>  'videos',
 ]

这种方法就是我想要的。

public function getType($extension){
    // my question is related to this method right here.
}

这是测试区域

var_dump( (new FileDetector())->getType('jpeg') ); // this should return 'image'

所以这里的想法是搜索$ files数组。

然而,在写这样的东西时我得到的第一个错误是' Illegal offset type'我无法创建一个如下所示的数组:

[ 
  ['jpg', ...] => 'images',
  ['avi', ...] => 'videos'
]

它的工作方式相反,如

[ 
  'images' => ['jpg', ...],
  'videos' => ['avi', ...],
]

如果你有时间,可以向我解释为什么第一个不起作用,或者提示有关该错误的提示,以便我可以在线查看...

第二个是我的主要问题,有很多方法可以实现我想要的但我想要最佳实践,这对我来说看起来就像最干净的方式。

谢谢你的时间。我希望我的要求是明确的。

3 个答案:

答案 0 :(得分:2)

对于问题的第一部分,php数组是关联数组,这意味着它们只能有一个值作为键。关联数组是键值对,其中一个键存在多个值,但反之则不然。因此,您收到此错误

[ 
  ['jpg', ...] => 'images',
  ['avi', ...] => 'videos'
]

而不是这个

[ 
  'images' => ['jpg', ...],
  'videos' => ['avi', ...],
]

更好的处理方法是

案例1:

[ 
  'images' => ['jpg', ...],
  'videos' => ['avi', ...],
]

案例2

[ 
  'jpg' => ['images'],
  'bmp' => ['images'],
  'avi' => ['videos'],
  'mp4' => ['videos'],
]

现在你可以看到,案例一是紧凑的,而不是多余的,所以继续将案例1作为2中更好的方法。

希望这会有所帮助。

答案 1 :(得分:1)

您正在尝试设置一个关联数组,并将数组作为键!

手册页:http://php.net/manual/en/language.types.array.php

  

密钥可以是整数或字符串。值可以是任何类型。

注:

  

PHP数组可以与PHP同时包含整数和字符串键   不区分索引数组和关联数组。

试试这个:

protected $files = [
    'jpeg' => 'images',
    'bmp'=> 'images',
    'mp4' =>  'videos',
    'avi' => 'videos'
];

答案 2 :(得分:0)

如果交换键和值(不能将数组用于Php数组中的键),我们可以遍历列表,直到找到您所追求的扩展名。

<?php
$type_extensions = [
     'images' => ['jpeg','bmp'],
     'videos' => ['mp4','avi']
];    

$get_type_from_extension = function($extension) use ($type_extensions) {
    foreach($type_extensions as $type => $extensions) {
        if(in_array($extension, $extensions)) 
            return $type;
    }
};

var_dump($get_type_from_extension('mp4'));
var_dump($get_type_from_extension('ogg'));

输出

string 'videos' (length=6)
null
相关问题