Willkommen in der Webstatt Zum Webstatt Blog und Stories
Franky Franky am 24.08.06 22:31

Moin,

ich habe ein Arrayproblem. Und zwarmöchte ich einen solchen Array...
Array
(
[0] => Array
(
[name] => HistoryDB/xxxxxxxxx/xxxxxxxxx/xxxxxxxxx-1105.xml
)

[1] => Array
(
[name] => HistoryDB/xxxxxxxxx/xxxxxxxxx/xxxxxxxxx-0305.xml
)

[2] => Array
(
[name] => HistoryDB/xxxxxxxxx/xxxxxxxxx/xxxxxxxxx-0106.xml
)
}


folgendermaßen sortieren: Dieses "name" im Array ist ein Pfad zu Datei. Nur der Dateiname selbst ist wichtig: Er ist nach dem Format: xxx-MMYY.xml augebaut.
Nun möchte ich den Array danach sortieren. Also praktisch so:

Array
(
[1] => Array
(
[name] => HistoryDB/xxxxxxxxx/xxxxxxxxx/xxxxxxxxx-0305.xml
)

[0] => Array
(
[name] => HistoryDB/xxxxxxxxx/xxxxxxxxx/xxxxxxxxx-1105.xml
)

[2] => Array
(
[name] => HistoryDB/xxxxxxxxx/xxxxxxxxx/xxxxxxxxx-0106.xml
)
}


Wie mache ich das?

Lg,
Franky

netcup.de Warum gibt es hier Werbung?
milahu milahu am 24.08.06 23:25

- Die Namen in ein Array packen. Indexverbindungen bewahren.
- Dieses Array sortieren.
- Array durchlaufen und mit Hilfe der Indexverbindungen Werte aus altem Array kopieren.

PS: Michael hat dich überholt :P

Franky Franky am 25.08.06 14:57

Jap so hatte ich mir das auch schon gedacht. Das Problem ist nur das es statt "name" auch noch 10 andrere Werte in dem Zahlenarray gibt.

Quote
- Dieses Array sortieren.

leichter gesagt als geschrieben :P
wie meinste das genau?

P.S.: Diese spammer immer...ich verstehs echt net... *rolleyes*

milahu milahu am 25.08.06 15:22

Ah, hab doch noch was besseres gefunden ;)
--> usort()

Alternativ, wenn du die Indexverbindungen nicht brauchst, kannst du den Namen als Index nehmen.
Musst nur aufpassen, dass du nichts überschreibst. Dann kannst du einfach mit ksort() sortieren.

Franky Franky am 26.08.06 09:59

Böö dangöö milahu, usort() wars :)

So hab ichs gelöst:
<?php
/**
This sort function allows you to sort an associative array while "sticking" some fields.

$sticky_fields = an array of fields that should not be re-sorted. This is a method of achieving sub-sorts within contiguous groups of records that have common data in some fields.

For example:

$a = array();

$a []= array(
'name' => 'Sam',
'age' => 23,
'hire_date' => '2004-01-01'
);
$a []= array(
'name' => 'Sam',
'age' => 44,
'hire_date' => '2003-03-23'
);
$a []= array(
'name' => 'Jenny',
'age' => 20,
'hire_date' => '2000-12-31'
);
$a []= array(
'name' => 'Samantha',
'age' => 50,
'hire_date' => '2000-12-14'
);

$sticky_fields = array( 'name' );
print_r( stickysort( $a, 'age', DESC_NUM, $sticky_fields ) );

OUTPUT:

Array
(
[0] => Array
(
[name] => Sam
[age] => 44
[hire_date] => 2003-03-23
)
[1] => Array
(
[name] => Sam
[age] => 23
[hire_date] => 2004-01-01
)
[2] => Array
(
[name] => Jenny
[age] => 20
[hire_date] => 2000-12-31
)
[3] => Array
(
[name] => Samantha
[age] => 50
[hire_date] => 2000-12-14
)
)

Here's why this is the correct output - the "name" field is sticky, so it cannot change its sort order. Thus, the "age" field is only sorted as a sub-sort within records where "name" is identical. Thus, the "Sam" records are reversed, because 44 > 23, but Samantha remains at the bottom, even though her age is 50. This is a way of achieving "sub-sorts" and "sub-sub-sorts" (and so on) within records of identical data for specific fields.

Courtesy of the $5 Script Archive: http://www.tufat.com
**/

define( 'ASC_AZ', 1000 );
define( 'DESC_AZ', 1001 );
define( 'ASC_NUM', 1002 );
define( 'DESC_NUM', 1003 );

function stickysort( $arr, $field, $sort_type, $sticky_fields = array() ) {
$i = 0;
foreach ($arr as $value) {
$is_contiguous = true;
if(!empty($grouped_arr)) {
$last_value = end($grouped_arr[$i]);

if(!($sticky_fields == array())) {
foreach ($sticky_fields as $sticky_field) {
if ($value[$sticky_field] <> $last_value[$sticky_field]) {
$is_contiguous = false;
break;
}
}
}
}
if ($is_contiguous)
$grouped_arr[$i][] = $value;
else
$grouped_arr[++$i][] = $value;
}
$code = '';
switch($sort_type) {
case ASC_AZ:
$code .= 'return strcasecmp($a["'.$field.'"], $b["'.$field.'"]);';
break;
case DESC_AZ:
$code .= 'return (-1*strcasecmp($a["'.$field.'"], $b["'.$field.'"]));';
break;
case ASC_NUM:
$code .= 'return ($a["'.$field.'"] - $b["'.$field.'"]);';
break;
case DESC_NUM:
$code .= 'return ($b["'.$field.'"] - $a["'.$field.'"]);';
break;
}

$compare = create_function('$a, $b', $code);

foreach($grouped_arr as $grouped_arr_key=>$grouped_arr_value)
usort ( $grouped_arr[$grouped_arr_key], $compare );

$arr = array();
foreach($grouped_arr as $grouped_arr_key=>$grouped_arr_value)
foreach($grouped_arr[$grouped_arr_key] as $grouped_arr_arr_key=>$grouped_arr_arr_value)
$arr[] = $grouped_arr[$grouped_arr_key][$grouped_arr_arr_key];

return $arr;
}
?>

Creative Commons Lizenzvertrag
Alle Inhalte des Webstatt-Archivs stehen unter einer Creative Commons Namensnennung - Weitergabe unter gleichen Bedingungen 3.0 Unported Lizenz.

Impressum & Kontakt