Hoe op laatste te sorteren?

Status
Niet open voor verdere reacties.

peps03

Gebruiker
Lid geworden
20 nov 2009
Berichten
93
Hoi,

Het script wat ik wil gebruiken om mijn fotos uit een map (upload) weer te geven, hebben allen een naam lijkend op: picture-037 picture-038 and so on.

het punt is, om de een of andere reden geeft het script niet de hoogste (nieuwste) eerst weer zoals ik het graag zou willen.

heeft iemand daar een oplossing voor?

script:

PHP:
$p = $_GET['p'];
if ($handle = opendir("images")) {
	$i = 1;
	while (false !== ($file = readdir($handle))) {
		if ($file != "." && $file != "..") {
			$img[$i] = $file;
			if ($p == $img[$i]) {
				$ci = $i;
			}
			$i++;
		}
	}

	closedir($handle);
	$ti = $i - 0;
	$pi = $ci - 1;
	
	if ($p == "") {
		$ni = $ci + 2;
		} 
	else {
		$ni = $ci + 1;
		}
	
	$prevNext = "";
	if ($pi > 0) {
		$piFile = $img[$pi];
		$prevNext .= "<a href=\"" . $_SERVER['PHP_SELF'] . "?p=" . $piFile . "\" title=\"show previous image\">«</a>";
		} 
	else {
		$prevNext .= "«";
		}
	
	$prevNext .= " | ";
	if ($ni <= $ti) {
		$niFile = $img[$ni];
		$prevNext .= "<a href=\"" . $_SERVER['PHP_SELF'] . "?p=" . $niFile . "\" title=\"show next image\">»</a>";
		} 
	else {
		$prevNext .= "»";
		}
	if ($p == "") {
		$p = $img[1];
		}
}



Alvast erg bedankt.

Mvg

Pepijn
 
na de while loop aanroepen:
PHP:
order_array_num($itm, 1, "DESC");

PHP:
function order_array_num ($array, $key, $order = "ASC") 
    { 
        $tmp = array(); 
        foreach($array as $akey => $array2) 
        { 
            $tmp[$akey] = $array2[$key]; 
        } 
        
        if($order == "DESC") 
        {arsort($tmp , SORT_STRING );} 
        else 
        {asort($tmp , SORT_STRING );} 

        $tmp2 = array();        
        foreach($tmp as $key => $value) 
        { 
            $tmp2[$key] = $array[$key]; 
        }        
        
        return $tmp2; 
    }
 
Hoi Nire,

Bedankt voor je reactie!

Dus, als ik je goed begrijp krijg ik dit:


PHP:
$p = $_GET['p'];
if ($handle = opendir("images")) {
	$i = 1;
	while (false !== ($file = readdir($handle))){
		if ($file != "." && $file != "..") {
			$img[$i] = $file;
			if ($p == $img[$i]) {
				$ci = $i;
			}
			$i++;
		}
	}
order_array_num($itm, 1, "DESC");
function order_array_num ($array, $key, $order = "ASC") 
    { 
        $tmp = array(); 
        foreach($array as $akey => $array2) 
        { 
            $tmp[$akey] = $array2[$key]; 
        } 
        
        if($order == "DESC") 
        {arsort($tmp , SORT_STRING );} 
        else 
        {asort($tmp , SORT_STRING );} 
 
        $tmp2 = array();        
        foreach($tmp as $key => $value) 
        { 
            $tmp2[$key] = $array[$key]; 
        }        
        
        return $tmp2; 
    }

	closedir($handle);
	$ti = $i - 0;
	$pi = $ci - 1;
	
	if ($p == "") {
		$ni = $ci + 2;
		} 
	else {
		$ni = $ci + 1;
		}
	
	$prevNext = "";
	if ($pi > 0) {
		$piFile = $img[$pi];
		$prevNext .= "<a href=\"" . $_SERVER['PHP_SELF'] . "?p=" . $piFile . "\" title=\"show previous image\">«</a>";
		} 
	else {
		$prevNext .= "«";
		}
	
	$prevNext .= " | ";
	if ($ni <= $ti) {
		$niFile = $img[$ni];
		$prevNext .= "<a href=\"" . $_SERVER['PHP_SELF'] . "?p=" . $niFile . "\" title=\"show next image\">»</a>";
		} 
	else {
		$prevNext .= "»";
		}
	if ($p == "") {
		$p = $img[1];
		}
}

Alvast bedankt!
 
Laatst bewerkt:
Hmm, zoals ik het hiervoor heb gepost werkt het niet :-(

Het wordt nog steeds niet gesorteerd op hoogste getal eerst..
 
je moet wel een variabele zetten voor order_array_num($itm, 1, "DESC");

dus:
PHP:
$itmSorted = order_array_num($itm, 1, "DESC");

ofzoiets. Dan is itmSorted je gesorteerde array.
 
Als ik het zo zet werkt het niet:..

Krijg dan deze foutmelding:
Fatal error: Call to undefined function: order_array_num() in line:
$itmSorted = order_array_num ($itm, 1, "DESC");

Heb ik het nu nog op de verkeerde plaatst staan?! wat doe ik fout?

PHP:
$p = $_GET['p'];
if ($handle = opendir("images")) {
    $i = 1;
    while (false !== ($file = readdir($handle))) {
        if ($file != "." && $file != "..") {
            $img[$i] = $file;
            if ($p == $img[$i]) {
                $ci = $i;
            }
            $i++;
        }
    }
 
 
$itmSorted = order_array_num ($itm, 1, "DESC");

function order_array_num ($array, $key, $order = "ASC") 
    { 
        $tmp = array(); 
        foreach($array as $akey => $array2) 
        { 
            $tmp[$akey] = $array2[$key]; 
        } 
        
        if($order == "DESC") 
        {arsort($tmp , SORT_STRING );} 
        else 
        {asort($tmp , SORT_STRING );} 
 
        $tmp2 = array();        
        foreach($tmp as $key => $value) 
        { 
            $tmp2[$key] = $array[$key]; 
        }        
        
        return $tmp2; 
    }
 
closedir($handle);
    $ti = $i - 0;
    $pi = $ci - 1;
    
    if ($p == "") {
        $ni = $ci + 2;
        } 
    else {
        $ni = $ci + 1;
        }
    
    $prevNext = "";
    if ($pi > 0) {
        $piFile = $img[$pi];
        $prevNext .= "<a href=\"" . $_SERVER['PHP_SELF'] . "?p=" . $piFile . "\" title=\"show previous image\">«</a>";
        } 
    else {
        $prevNext .= "«";
        }
    
    $prevNext .= " | ";
    if ($ni <= $ti) {
        $niFile = $img[$ni];
        $prevNext .= "<a href=\"" . $_SERVER['PHP_SELF'] . "?p=" . $niFile . "\" title=\"show next image\">»</a>";
        } 
    else {
        $prevNext .= "»";
        }
    if ($p == "") {
        $p = $img[1];
        }
}

Wederom bedankt voor de hulp, heb dit script hard nodig!
 
kan iemand vertellen waarom deze code het nu niet doet na de aanpassingen van Nire?

Alvast bedankt!
 
Probeer eens de spaties na de functie en voor het ( te verwijderen.
Zowel in de functie als in de aanroep daarvan.
 
Heb de spaties verwijderd, het ziet er nu zo uit:

PHP:
$p = $_GET['p'];
if ($handle = opendir("images")) {
    $i = 1;
    while (false !== ($file = readdir($handle))) {
        if ($file != "." && $file != "..") {
            $img[$i] = $file;
            if ($p == $img[$i]) {
                $ci = $i;
            }
            $i++;
        }
    }
$itmSorted=order_array_num($itm, 1, "DESC");
function order_array_num($array, $key, $order = "ASC") 
    { 
        $tmp = array(); 
        foreach($array as $akey => $array2) 
        { 
            $tmp[$akey] = $array2[$key]; 
        } 
        
        if($order == "DESC") 
        {arsort($tmp , SORT_STRING );} 
        else 
        {asort($tmp , SORT_STRING );} 
 
        $tmp2 = array();        
        foreach($tmp as $key => $value) 
        { 
            $tmp2[$key] = $array[$key]; 
        }                
        return $tmp2; 
    }
closedir($handle);
    $ti = $i - 0;
    $pi = $ci - 1;
    
    if ($p == "") {
        $ni = $ci + 2;
        } 
    else {
        $ni = $ci + 1;
        }
    
    $prevNext = "";
    if ($pi > 0) {
        $piFile = $img[$pi];
        $prevNext .= "<a href=\"" . $_SERVER['PHP_SELF'] . "?p=" . $piFile . "\" title=\"show previous image\">«</a>";
        } 
    else {
        $prevNext .= "«";
        }
    
    $prevNext .= " | ";
    if ($ni <= $ti) {
        $niFile = $img[$ni];
        $prevNext .= "<a href=\"" . $_SERVER['PHP_SELF'] . "?p=" . $niFile . "\" title=\"show next image\">»</a>";
        } 
    else {
        $prevNext .= "»";
        }
    if ($p == "") {
        $p = $img[1];
        }
}

krijg nog steeds deze foutmelding:

Fatal error: Call to undefined function: order_array_num() in http://*********** on line 35
= regel: $itmSorted=order_array_num($itm, 1, "DESC");

de foutmelding is hetzelfde gebleven.

alvast bedankt!
 
Je hebt de function in je while loop staan. Verplaats de function eens in zijn geheel naar boven.
 
De foutmelding is nu verdwenen, de foto's worden weergegeven, er wordt alleen niks gesorteerd:

de fotos worden op deze volgorde weergegeven:
picture-41
picture-44
picture-42
picture-45
picture-43

terwijl deze volgorde de bedoeling is:
picture-45
picture-44
picture-43
picture-42
picture-41
enz

de bedoeling is.. (de nieuwste eerst)
 
Misschien denk ik te simpel, maar als je de array eerst door natsort() haalt om een natuurlijke volgorde te krijgen en vervolgens met array_reverse() omdraait krijg je toch het reultaat waar je naar op zoek bent?
 
De simpele oplossingen zijn de beste. Met natsort en reverse moet het inderdaad ook lukken. :thumb: Goed bezig flitsflitsflits.

Hoop niet voor je dat je zo vaak geflitst wordt.
 
Bedankt beide voor de reactie!

Moet de eerder voorgestelde code van Nire dan weg?:

PHP:
function order_array_num ($array, $key, $order = "ASC") 
    { 
        $tmp = array(); 
        foreach($array as $akey => $array2) 
        { 
            $tmp[$akey] = $array2[$key]; 
        } 
        
        if($order == "DESC") 
        {arsort($tmp , SORT_STRING );} 
        else 
        {asort($tmp , SORT_STRING );} 
 
        $tmp2 = array();        
        foreach($tmp as $key => $value) 
        { 
            $tmp2[$key] = $array[$key]; 
        }        
        
        return $tmp2; 
    }

en dan voor de:
$p = $_GET['p'];

de: natsort() en de: array_reverse() zetten?
 
Uitgaande van je originele bericht (eerste bericht in deze thread) zou je de code kunnen aanpassen door het toevoegen van:
PHP:
natsort($img);
$img = array_reverse($img);
nadat je de array hebt gemaakt, bijvoorbeeld na closedir() op regel 14
 
Het zit niet mee..

Lastig vraagstuk.

flitsflits, wat jij zegt, uitgaan van oude code (eerste post) en dan dit toevoegen:
natsort($img);
$img = array_reverse($img);

onder:
closedir()

werkt nog niet.. wanneer ik maar 3 foto's in de map heb staan worden maar 2 van de 3 foto's weergegeven,
wanneer ik alleen ----> natsort($img); <------- gebruik, dan alle 3, maar niet opvolg orde, 1,3,2 ipv foto: 3,2,1

iemand nog opties over?

bedankt!
 
In dat geval klopt er iets niet bij het aanmaken van vorige/volgende of de afhandelijk van $_GET. Als je met print_r($img) even de array op het scherm zet, zul je zien dat alle bestanden wel degelijk in de array zitten, en bovendien op de door jou gewenste volgorde.

De rest van de code is niet echt leesbaar, dus ik zie zo 1 2 3 het probleem niet.
 
Laatst bewerkt:
PHP:
<?php
	if ($handle = opendir("images")) {
		$img = array();
		while (false !== ($file = readdir($handle))) {
			if ($file != "." && $file != "..") {
				$img[] = $file;
			}
		}
		natsort($img);
		$img = array_reverse($img);
		if ($_SERVER["REQUEST_METHOD"] == "GET" && isset($_GET["p"]) && array_key_exists($_GET["p"],$img)) {
			$p = $_GET["p"];
		} else {
			$p = 0;
		}
		echo "<img src='images/".$img[$p]."' /><hr />";
		$opbouw = array();
		if (array_key_exists(($p-1),$img)) {
			$opbouw[] = "<a href='?p=".($p-1)."'>&laquo;</a>";
		}
		foreach ($img as $id => $plaatje) {
			if ($p == $id) {
				$opbouw[] = $id;
			} else {
				$opbouw[] = "<a href='?p=".$id."'>".$id."</a> ";
			}
		}
		if (array_key_exists(($p+1),$img)) {
			$opbouw[] = "<a href='?p=".($p+1)."'>&raquo;</a>";
		}
		echo "<p>".implode(" | ",$opbouw)."</p>";
	} else {
		echo "kan map niet lezen";
	}
?>
 
Hee Flits!

Dit script werkt perfect! :thumb:

Heel erg bedankt! dit is precies zoals het moet werken.

groet!
 
Flits,

nog 1 aller laatste vraag. als er 50 foto's in de map staan, dan krijg ik ook 50 getallen eronder te zien. hoe kan ik de rij inperken?

misschien tot zo iets:

<< 10, 20 , ..24,25,26... 30,40, 50, >>

alvast bedankt!

mvg
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan