关于在数组中正确和快速搜索的问题

时间:2014-06-25 09:04:39

标签: php arrays

我有一个关于在php数组中正确和快速搜索的问题。

我有输入数组:

array (size=2)
  0 => 
    array (size=7)
      'Videos' => 
        array (size=2)
          240 => 
            array (size=2)
              ...
          120 => 
            array (size=2)
              ...
      'Texts' => 
        array (size=0)
          empty
      'Price' => float 0
      'QaAudio' => int 1
      'QaVideo' => int 3
      'Level' => string 'normal' (length=6)
      'PreviewPic' => 
        array (size=7)
          40 => 
            array (size=12)
              ...
          60 => 
            array (size=12)
              ...
          140 => 
            array (size=12)
              ...
          160 => 
            array (size=12)
              ...
          320 => 
            array (size=12)
              ...
          640 => 
            array (size=12)
              ...
          1024 => 
            array (size=12)
              ...
  1 => 
    array (size=7)
      'Videos' => 
       array (size=3)
          480 => 
            array (size=2)
              ...
          360 => 
            array (size=2)
              ...
          120 => 
            array (size=2)
              ...
      'Texts' => 
        array (size=0)
          empty
      'Price' => float 0
      'QaAudio' => int 1
      'QaVideo' => int 3
      'Level' => string 'sexy' (length=4)
      'PreviewPic' => 
        array (size=7)
          40 => 
            array (size=12)
              ...
          60 => 
            array (size=12)
              ...
          140 => 
            array (size=12)
              ...
          160 => 
            array (size=12)
              ...
          320 => 
            array (size=12)
              ...
          640 => 
            array (size=12)
              ...
          1024 => 
            array (size=12)
              ...

我需要在其中找到视频,它在视频键中具有最大值。(它在示例中可以看到360,240,120个值)并且等级键等于“正常”或“性感”值。

我写了一些方法来做到这一点:

public function getPresentationVideo($id)
    {
        $result = [];
        $notHardVideos = [];
        $profileVideos = $this->getProfilesVideos($id,0,50);
        if ($profileVideos && count($profileVideos) > 0) {
            foreach ($profileVideos as $video) {
                if (in_array($video['Level'],['normal','sexy'])) {
                    $video['maxVideoQuality'] = max(array_keys($video['Videos']));
                    $notHardVideos[] = $video;
                }
            }
            $keyForMaxQuality = 0;
            if (count($notHardVideos) > 1) {
                $maxQuality = 0;
                foreach($notHardVideos as $key => $video) {
                    if($video['maxVideoQuality'] > $maxQuality)
                    {
                        $maxQuality = $video['maxVideoQuality'];
                        $keyForMaxQuality = $key;
                    }
                }
            }
            if (count($notHardVideos) > 0) {
                $result = $notHardVideos[$keyForMaxQuality];
                unset($result['maxVideoQuality']);
            }
        }

        return $result;
    }

它做得很好。

但我想知道有没有更有效的方法来做到这一点。 你有什么想法吗?

提前致谢。

1 个答案:

答案 0 :(得分:1)

$result = array_reduce($videos, function ($result, array $video) {
    if (!in_array($video['Level'], ['normal', 'sexy'])) {
        return $result;
    }
    if (!$result) {
        return $video;
    }
    if (max(array_keys($video['Videos'])) > max(array_keys($result['Videos']))) {
        return $video;
    }
    return $result;
});

这将返回具有' normal'的子数组。或者'性感'等级(BTW,FTW ?!),其中'视频'子阵列。它没有包含任何其他注意事项,正如您在代码中所看到的那样,因为您没有准确指出这些注意事项。但是,如果需要,您应该了解并添加更多检查。

有关此功能的帮助,请参阅http://php.net/array_reduce。简而言之,它依次获取数组中的每个元素,并将其与之前的最佳候选者进行比较。即,$result一开始就没什么,但是当你找到一个正常的'或者'性感'视频将成为该视频,在随后的通话中,具有更高密钥的视频将获胜。