User Tools

Site Tools


php:kompost:reorderarray

[PHP] Reorder Array

Ausgangslage

Diese Klasse erstellte ich aufgrund einer http://www.tutorials.de/php/370687-problem-array-sortieren.htmlm Anfrage im Tutorials-Forum.

ich habe ein array mit Bildern die aus einem Ordner ausgelesen werden. Die haben eine feste Reihenfolge:
1,2,3,4,5,6
Jetzt brauche ich aber das Array ein wenig anders. Der Startpunkt soll sozusagen geändert werden.
Bsp: 4,5,6,1,2,3 oder 2,3,4,5,6,1

Und nun meine, natürlich für dieses Beispiel viel zu ausführliche, Lösung

Die Klasse Reorder

Reorder.php
<?php
/**
* mpl           by ERB software
* @author       stefan.erb(at)erb-software.com
*/
 
function reorder_by_offset($array, $offset){ return Reorder::staticByOffset($array, $offset);}
function reorder_by_key($array, $key){ return Reorder::staticByKey($array, $key);}
function reorder_by_value($array, $value){ return Reorder::staticByValue($array, $value);}
 
class Reorder{
	public function __construct($array){
		$this->array = $array;
		//Index über die Schlüssel legen
		$this->index = array_keys($array);
	}
 
	/**
	 * ändert die Reihenfolge. Beginnt den Array mit dem Eintrag mit der Position $offset
	 * des Ausgangsarrays und hängt die vorgelagerten Einträge in unveränderter Reihenfolge hinten an
	 * @param $offset   Long
	 * @return  Array oder false
	 */
	public function byOffset($offset){
		//Test ob $offset nicht grössr als die Anzahl items ist
		if(count($this->array)-1 < abs($offset)) return false;
		//Der Anfang des neuen Arrays extrahieren
		$startArray = array_slice($this->array, $offset, count($this->array) - $offset, true);
		//Das Ende des neuen Arrays extrahieren  
		$endArray = array_slice($this->array, 0, $offset, true);
		//Die beiden Teile zusammensetzen und zurückgeben
		return $startArray +$endArray; 
	}
 
	/**
	 * ändert die Reihenfolge analog zu rorderByOffset. sucht jedoch nach dem key
	 * @param $startKey     Variant
	 * @return  Array oder false
	 */
	public function byKey($startKey){
		//Das Offset des Keys bestimmen
		$offset = array_search($startKey, $this->index);
		//Die reorder-Funktion nach Offset anwenden
		return ($offset ===false) ? false : $this->byOffset($offset); 
	}
 
	/**
	 * ändert die Reihenfolge analog zu rorderByOffset. sucht jedoch nach dem Wert
	 * @param $startValue   Variant
	 * @return  Array oder false
	 */
	public function byValue($startValue){
		//Schlüssel des Wertes bestimmen
		$key = array_search($startValue, $this->array);
		//die reorder-Funktion nach key anwenden
		return ($key ===false) ? false : $this->byKey($key);
	}
 
	protected static function getInstanceOf($array){
		return new self($array);     
	}
 
	public static function staticByOffset($array, $offset){
		return self::getInstanceOf($array)->byOffset($offset); 
	}
 
	public static function staticByKey($array, $startKey) {
		return self::getInstanceOf($array)->byKey($startKey); 
	}
 
	public static function staticByValue($array, $startValue){
		return self::getInstanceOf($array)->byValue($startValue); 
	}       
}
?>

Ein Testscript

test.php
<?php
include_once('Reorder.php');
//Test-Array
$array = array(
				'a' => 'AA',
				'b' => 'BB',
				'c' => 'CC',
				'd' => 'DD',
				'e' => 'EE',
				'f' => 'FF',
				'g' => 'GG',
				'h' => 'HH');
//Testaufrufe der Funktion:
//Nach Index 4: Erste Paarung: 'e'=>'EE'
print("Nach Index 4:\n");
print_r(reorder_by_offset($array, 4));
//Nach Schlüssel: Erste Paarung 'f' => 'FF'
$reorder = new Reorder($array);
print("Nach Schlüssel f:\n");
print_r($reorder->byKey('f'));
//Nach Value: Erste Paarung 'c'=>'CC'
print("Nach Wert CC:\n");
print_r($reorder->byValue('CC'));
?>

Die Ausgabe des Testscriptes

Nach Index 4:
Array
(
	[e] => EE
	[f] => FF
	[g] => GG
	[h] => HH
	[a] => AA
	[b] => BB
	[c] => CC
	[d] => DD
)
Nach Schlüssel f:
Array
(
	[f] => FF
	[g] => GG
	[h] => HH
	[a] => AA
	[b] => BB
	[c] => CC
	[d] => DD
	[e] => EE
)
Nach Wert CC:
Array
(
	[c] => CC
	[d] => DD
	[e] => EE
	[f] => FF
	[g] => GG
	[h] => HH
	[a] => AA
	[b] => BB
)
php/kompost/reorderarray.txt · Last modified: 11.12.2013 11:52:02 (external edit)