【问题标题】:PHP: array search when array doesn't start on zeroPHP:当数组不从零开始时进行数组搜索
【发布时间】:2017-05-11 14:06:03
【问题描述】:

我试图在一个不以零开头的数组中找到一个键。

这是我不太优雅的解决方案:

private $imagetypes = [
    1 => [
        'name' => 'banner_big',
        'path' => 'campaigns/big/'
    ],
    2 => [
        'name' => 'banner_small',
        'path' => 'campaigns/small/'
    ],
// ...

如果我使用$key = array_search('banner_big', array_column($this->imagetypes, 'name'));,结果是0

我想出了这个解决方案,但我觉得我不必要地复杂了代码:

 /**
 * @param string $name
 * @return int
 */
public function getImagetypeFromName($name)
{
    $keys = array_keys($this->imagetypes);
    $key = array_search($name, array_column($this->imagetypes, 'name'));
    if ($key !== false && array_key_exists($key, $keys)) {
        return $keys[$key];
    }
    return -1;
}

有没有比这个更好的解决方案。

我无法更改密钥。

【问题讨论】:

    标签: php arrays key


    【解决方案1】:

    只保存索引

    $key = array_search('banner_big',
                         array_combine(array_keys($imagetypes),
                                        array_column($imagetypes, 'name')));
    

    demo on eval.in

    【讨论】:

      【解决方案2】:

      问题是array_column 将返回一个新数组(没有现有索引)

      所以在你的例子中。

      $key = array_search('banner_big', array_column($this->imagetypes, 'name'));
      
      var_dump($key);
      
      //$key is 0 as 0 is the key for the first element in the array returned by array_column.
      

      您可以通过使用现有键创建一个新数组来缓解这种情况。

      【讨论】:

        【解决方案3】:

        那是因为array_column() 生成了另一个数组(从 索引零),正如您可能想象的那样。解决这个问题的一个想法是 使用array_map() 转换数组,将其简化为键和图像 名称(这是您要搜索的内容)。钥匙是一样的, 这可以通过一个简单的回调来实现:

        function($e) {
            return $e['name'];
        }
        

        因此,为您的案例提供完整的实现:

        public function
        getImagetypeFromName($name)
        {
            $key = array_search($name, array_map(function($e) {
                return $e['name'];
            }, $this->imagetypes));
        
            return $key ?: -1;
        }
        

        【讨论】:

          猜你喜欢
          • 2011-07-04
          • 1970-01-01
          • 2013-12-15
          • 2011-07-10
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-03-20
          • 1970-01-01
          相关资源
          最近更新 更多