/** * @param LimitHexQualityInterface $limitHexQualityData * * @return array */ protected function searchForImagesByHash(LimitHexQualityInterface $limitHexQualityData) { $rgb = $this->hex2rgb($limitHexQualityData->getHex()); $images = array(); $getLimit = $limitHexQualityData->getLimit() * 3; $fetchAll = function ($getLimit, &$fetchedImages = null) use(&$fetchAll) { if (is_null($fetchedImages)) { $images = $this->fetch($getLimit); } else { $images = $this->instagramWrapper->pagination($fetchedImages, $getLimit); } if (!is_null($images) || !empty($images) && !empty($images->meta) && $images->meta->code == '200') { if (is_null($fetchedImages)) { $fetchedImages = $images; } else { $fetchedImages->pagination = $images->pagination; $fetchedImages->data = array_merge($fetchedImages->data, $images->data); } } else { return $fetchedImages; } if (count($fetchedImages->data) < $getLimit && !empty($images->pagination)) { return $fetchAll($getLimit, $fetchedImages); } return $fetchedImages; }; $quality = $limitHexQualityData->getQuality(); $count = 0; $rec = function ($limit, $rgb, $fetchedImages) use(&$rec, &$images, $quality, &$count, $fetchAll, $getLimit) { if (is_object($fetchedImages) && !empty($fetchedImages->data) && is_array($fetchedImages->data)) { $sorted = []; foreach ($fetchedImages->data as $item) { $count++; $diff = $this->colorDiff($rgb, ColorThief::getColor($item->images->thumbnail->url, 1)); if ($item->type != 'image' || $diff >= 300 + ceil($count / 10) * 100) { continue; } $sorted[] = ['i' => $item->images->{$quality}, 'diff' => $diff]; } usort($sorted, function ($a, $b) { if ($a['diff'] == $b['diff']) { return 0; } return $a['diff'] < $b['diff'] ? -1 : 1; }); foreach ($sorted as $item) { if (count($images) >= $limit) { return null; } $images[] = $item; } $count = 0; unset($fetchedImages->data); return $rec($limit, $rgb, $fetchAll($getLimit, $fetchedImages)); } return null; }; $rec($limitHexQualityData->getLimit(), $rgb, $fetchAll($getLimit)); usort($images, function ($a, $b) { if ($a['diff'] == $b['diff']) { return 0; } return $a['diff'] < $b['diff'] ? -1 : 1; }); return array_map(function ($item) { return $item['i']; }, $images); }