-1

Taking the following;

// Looping through images passed to function...

list($width[$i], $height[$i]) = getimagesize($img_urls[$i]);

// ... Now to reorder by height

How can I reorder the $height array to tallest > shortest, while maintaining the key relationship with the correct $width value?

I've attempted with uasort, but I've had no luck. The "closest" attempt I've had is below, but that sorts from smallest to largest

uasort($height, function($a, $b) use ($i) {
    return $a[$i] + $b[$i];
});
Chris Brown
  • 4,445
  • 3
  • 28
  • 36
  • 1
    PLease code your sorting attempts so that we can see what your problem is. `uasort` is the way to go... – arkascha May 03 '14 at 20:58

3 Answers3

2

Firstly, use structures:

class Image {
    public $width;
    public $height;
}

This is neccessary because width and heights of the image are hardly connected. Width of one image shows nothing without height of image. Same for height. You should link this data. For example, in structure.

After that, get images heights and widths:

$images = array();

// get widths and heights
loop start
    $img = new Image();
    $img->width = assign width;
    $img->height = assign height;
    $images[] = $img;
loop end

Finally, sort:

function cmp($a, $b) {
    if ($a->height == $b->height) {
        return 0;
    }
    return ($a->height < $b->height) ? -1 : 1;
}

uasort($images, 'cmp');

//$images are sorted by height now

Let me know if something is unclear.

Sharikov Vladislav
  • 7,049
  • 9
  • 50
  • 87
0

Try this:

$images = array();
for ($i = 0; $i < count($img_urls); $i++) {
    $image_size = getimagesize($img_urls[$i]);
    $images[$image_size[1]]['width'] = $image_size[0];
    $images[$image_size[1]]['height'] = $image_size[1];
}
sort($images);
var_dump($images);
Manoj Yadav
  • 6,560
  • 1
  • 23
  • 21
-1

uasort should work fine:

uasort( $height, function ( $a, $b ) { if ( $a == 0 ) { return 0; } else { return ( $a > $b ) ? -1 : 1; } } );

If I do this:

$arr = array();
$arr[0] = 512;
$arr[1] = 1024;
uasort( $arr, function ( $a, $b ) { if ( $a == 0 ) { return 0; } else { return ( $a > $b ) ? -1 : 1; } } );
var_dump( $arr );
var_dump( $arr[0] );
var_dump( $arr[1] );

I get:

array(2) {
  [1]=>
  int(1024)
  [0]=>
  int(512)
}
int(512)
int(1024)
Krenair
  • 570
  • 5
  • 21