PHP: natsort ile sıralama dizi

3 Cevap php

Ben bir resmini oluşturur ve bir resim galerisi listeleyen bir PHP komut dosyası var. Ben yaşıyorum sorun sunucu üzerinde damgası bunu listeler ama 'doğal' listelemek istiyorum olmasıdır.

<?php
# SETTINGS
$max_width = 100;
$max_height = 100;
$per_page = 24;

$page = $_GET['page'];

$has_previous = false;
$has_next = false;

function getPictures() {
    global $page, $per_page, $has_previous, $has_next;
    if ( $handle = opendir(".") ) {
        $lightbox = rand();
        echo '<ul id="pictures">';

        $count = 0;
        $skip = $page * $per_page;

        if ( $skip != 0 )
            $has_previous = true;

        while ( $count < $skip && ($file = readdir($handle)) !== false ) {
            if ( !is_dir($file) && ($type = getPictureType($file)) != '' )
                $count++;
        }
        $count = 0;
        while ( $count < $per_page && ($file = readdir($handle)) !== false ) {
            if ( !is_dir($file) && ($type = getPictureType($file)) != '' ) {
                if ( ! is_dir('thumbs') ) {
                    mkdir('thumbs');
                }
                if ( ! file_exists('thumbs/'.$file) ) {
                    makeThumb( $file, $type );
                }
                echo '<li><a href="'.$file.'" class="zoom" rel="group">';
                echo '<img src="thumbs/'.$file.'" alt="" />';
                echo '</a></li>';
                $count++;
            }
        }
        echo '</ul>';

        while ( ($file = readdir($handle)) !== false ) {
            if ( !is_dir($file) && ($type = getPictureType($file)) != '' ) {
                $has_next = true;
                break;
            }
        }
    }
}

function getPictureType($file) {
    $split = explode('.', $file); 
    $ext = $split[count($split) - 1];
    if ( preg_match('/jpg|jpeg/i', $ext) ) {
        return 'jpg';
    } else if ( preg_match('/png/i', $ext) ) {
        return 'png';
    } else if ( preg_match('/gif/i', $ext) ) {
        return 'gif';
    } else {
        return '';
    }
}

function makeThumb( $file, $type ) {
    global $max_width, $max_height;
    if ( $type == 'jpg' ) {
        $src = imagecreatefromjpeg($file);
    } else if ( $type == 'png' ) {
        $src = imagecreatefrompng($file);
    } else if ( $type == 'gif' ) {
        $src = imagecreatefromgif($file);
    }
    if ( ($oldW = imagesx($src)) < ($oldH = imagesy($src)) ) {
        $newW = $oldW * ($max_width / $oldH);
        $newH = $max_height;
    } else {
        $newW = $max_width;
        $newH = $oldH * ($max_height / $oldW);
    }
    $new = imagecreatetruecolor($newW, $newH);
    imagecopyresampled($new, $src, 0, 0, 0, 0, $newW, $newH, $oldW, $oldH);
    if ( $type == 'jpg' ) {
        imagejpeg($new, 'thumbs/'.$file);
    } else if ( $type == 'png' ) {
        imagepng($new, 'thumbs/'.$file);
    } else if ( $type == 'gif' ) {
        imagegif($new, 'thumbs/'.$file);
    }
    imagedestroy($new);
    imagedestroy($src);
}
?>

3 Cevap

Hüner bir dizi içine her şeyi koymak oldu ... Ben senin getPictures() fonksiyonunu yeniden yazma özgürlük aldı ... Bu bir sıralama uygular.

function getPictures() {
    global $page, $per_page, $has_previous, $has_next;

    if (!is_dir('thumbs')) {
    	mkdir('thumbs');
    }

    if ($handle = opendir(".")) {
    	$lightbox = rand();

    	$files = array();

    	while (($file = readdir($handle)) !== false) {
    		if (!is_dir($file) && ($type = getPictureType($file)) != '') {
    			$files[] = $file;
    		}
    	}

    	natsort($files);

    	$has_previous = $skip != 0;
    	$has_next = (count($files) - $skip - $per_page) > 0;

    	$spliceLength = min($per_page, count($files) - $skip);
    	$files = array_slice($files, $skip, $spliceLength);

    	echo '<ul id="pictures">';

    	foreach($files as $file) {
    		if (!file_exists('thumbs/' . $file)) {
                $type = getPictureType($file);
    			makeThumb($file, $type);
    		}

    		echo '<li><a href="' . $file . '" class="zoom" rel="group">';

    		echo '<img src="thumbs/' . $file . '" alt="" />';

    		echo '</a></li>';
    	}

    	echo '</ul>';
    }
}

similair hobodave ama ben php en natsort işlevi yerleşik kullanabilirsiniz:


uksort($output, "strnatcmp");

Hatta bir dizi kullanarak değiliz.

Bunun yerine bunları karşılaşmak gibi Li'nin echo'ing size dosya ile endeksli bir dizi, içine koymak gerekir.

$output[$file] = '<li>etc</li>';

Lütfen döngü tamamlandıktan sonra bir kez, PHP'nin natsort () sadece değerler çalışır çünkü, doğal anahtar sıralama yapmak için özel bir işlevi kullanmak gerekir.

function natksort($array) {
    $keys = array_keys($array);
    natsort($keys);

    $ret = array();
    foreach ($keys as $k) {
        $ret[$k] = $array[$k];
    }

    return $ret;
}

$output = natksort($output);
echo '<ul>';
foreach ($output as $out) {
    echo $out;
}
echo '</ul>';

Edit

Vay be, ben sıralama yapmak için bu küçük gem bulundu:

uksort($array, 'strnatcasecmp');

Kredi: http://www.chipstips.com/?p=269