需要有关将数组值与原始键重新关联的建议

时间:2011-05-24 14:41:05

标签: php

我正在尝试编写一个程序,它将从网页中抓取一堆图像并找出哪些图像是最大的。

到目前为止,我已经拍摄了图像,将它们放入数组中,使用getimagesize()函数来确定高度。然后我将所有高度放入另一个数组中,并按相反的顺序对它们进行排序以获得最大的数组。到目前为止一切都很好。

我现在的问题是我必须找到一种方法将最大的图像与其初始图像链接重新关联。我曾想过可能会运行初始代码来从网页上再次获取图像。然后比较我用来确定最大图像的数组中的第一个值和图像第二次,但这似乎浪费了带宽,我感觉有一种更简单的方法来重新关联高度值与它的初始形象。我是对的吗?

<?php

$url = 'http://lockerz.com/s/104049300';

// Fetch page
$string = FetchPage($url);

// Regex that extracts the images (full tag)
$image_regex_src_url = '/<img[^>]*'.

'src=[\"|\'](.*)[\"|\']/Ui';

preg_match_all($image_regex_src_url, $string, $out, PREG_PATTERN_ORDER);

$img_tag_array = $out[0];

echo "<pre>"; print_r($img_tag_array); echo "</pre>";

// Regex for SRC Value
$image_regex_src_url = '/<img[^>]*'.

'src=[\"|\'](.*)[\"|\']/Ui';

preg_match_all($image_regex_src_url, $string, $out, PREG_PATTERN_ORDER);

$images_url_array = $out[1];
$image_heights_array = array();

foreach ($images_url_array as $imagelink)
{
if (substr($imagelink,0,7)=="http://")
    {
     $getheight = getimagesize($imagelink);
     array_push($image_heights_array,"$getheight[1]");
    }
}

rsort($image_heights_array);
echo "<pre>"; print_r($image_heights_array); echo "</pre>";
// Fetch Page Function

function FetchPage($path)
{
$file = fopen($path, "r");

if (!$file)
{
exit("The was a connection error!");
} 

$data = '';

while (!feof($file))
{
// Extract the data from the file / url

$data .= fgets($file, 1024);
}
return $data;
}
?>  

4 个答案:

答案 0 :(得分:0)

将大小和网址保留在一个数组中,并使用usort对多维数组进行排序。

$images_url_array = $out[1];
$images = array();

foreach ($images_url_array as $imagelink)
{
    if (substr($imagelink, 0, 7)=="http://")
    {
        $getheight = getimagesize($imagelink);
        $images[] = array('height' => $getheight[1], 'url' => $imagelink);
    }
}

usort($images, function ($a, $b)
    {
        if ($a['height'] > $b['height']) return 1;
        elseif ($a['height'] < $b['height']) return -1;
        else return 0;
    });

答案 1 :(得分:0)

我不懂PHP所以我无法帮助你解决这些问题,但也许你可以试试这个想法。让第一个数组存储一个ImageObject。这个类有三个属性,imageize,id和src。

您可以浏览第一个数组,找到imagesize,然后按最大尺寸对其进行排序。使用id来获取单个对象。

答案 2 :(得分:0)

如果你使用arsort()数组键将被保留,那么你可以reset()数组指针开始数组,并得到第一个key()

但是你还需要在images_url_array和image_height_array中保留相同的键

foreach ($images_url_array as $key => $imagelink)
{
    if (substr($imagelink,0,7)=="http://")
    {
        $getheight = getimagesize($imagelink);
        $image_heights_array[$key] = $getheight[1];
    }
}

//...

rsort($image_heights_array);
reset($image_heights_array);
$largest_image_key = key($image_heights_array);
$largest_image_url = $images_url_array[$key];

答案 3 :(得分:0)

首先关闭:

// Regex that extracts the images (full tag)
$image_regex_src_url = '/<img[^>]*'.

'src=[\"|\'](.*)[\"|\']/Ui';

preg_match_all($image_regex_src_url, $string, $out, PREG_PATTERN_ORDER);

$img_tag_array = $out[0];

echo "<pre>"; print_r($img_tag_array); echo "</pre>";

// Regex for SRC Value
$image_regex_src_url = '/<img[^>]*'.

'src=[\"|\'](.*)[\"|\']/Ui';

preg_match_all($image_regex_src_url, $string, $out, PREG_PATTERN_ORDER);

HTML解析正则表达式ewww。让我们用HTML解析器简化这个......

<?php
// EDIT: Use a custom function to do the
// reverse of SORT_NUMERIC with asort
function height_compare($a, $b)
{
    if ($a == $b) {
        return 0;
    }
    return ($a > $b) ? -1 : 1;
}

$url = 'http://lockerz.com/s/104049300';

$doc = new DOMDocument();
// Okay this is HTML is kind of screwy
// So we're going to supress errors
@$doc->loadHTMLFile($url);

// Get all images
$images_list = $doc->getElementsByTagName('img');

$images = array();
foreach($images_list as $image) {
  // Get the src attribute
  $image_source = $image->getAttribute('src');
  $image_size_info = getimagesize($image_source);

  $images[$image_source] = $image_size_info[1];
}

// Do a numeric sort on the height
uasort($images, "height_compare");
print_r($images);
?>

更短,更易读。结果:

$ php test.php 

Array
(
    [http://c0013784.cdn1.cloudfiles.rackspacecloud.com/x2_633aa94] => 328
    [http://ad.doubleclick.net/ad/buz.plixi/photos;pos=300a;celeb=;kw=;tile=2;sz=300x250,300x600;ord=123456789?] => 250
    [http://static.lockerz.com/pegasus/images/video_thumb.jpg?1.0.0] => 207
    [http://static.lockerz.com/pegasus/images/plixi-banner.png?1.0.0] => 107
    [http://ad.doubleclick.net/ad/buz.plixi/photos;pos=728a;celeb=;kw=;tile=1;sz=728x90;ord=123456789?] => 90
    [http://c0013787.cdn1.cloudfiles.rackspacecloud.com/x2_636f30c] => 79
    [http://c0013787.cdn1.cloudfiles.rackspacecloud.com/x2_637676e] => 79
    [http://c0013787.cdn1.cloudfiles.rackspacecloud.com/x2_63735a0] => 79
    [http://c0013787.cdn1.cloudfiles.rackspacecloud.com/x2_636e73c] => 79
    [http://c0013787.cdn1.cloudfiles.rackspacecloud.com/x2_63795d0] => 79
    [http://c0013787.cdn1.cloudfiles.rackspacecloud.com/x2_636a2c7] => 79
    [http://c0013787.cdn1.cloudfiles.rackspacecloud.com/x2_636bf79] => 79
    [http://c0013787.cdn1.cloudfiles.rackspacecloud.com/x2_636ca08] => 79
    [http://c0013787.cdn1.cloudfiles.rackspacecloud.com/x2_636e419] => 79
    [http://c0013787.cdn1.cloudfiles.rackspacecloud.com/x2_636deca] => 79
    [http://c0013787.cdn1.cloudfiles.rackspacecloud.com/x2_6384277] => 79