Webstatt.org - Community seit 2006 - 2012 (2024?)

Array "besonders" nach Datum Ordnen

Avatar user-182
24.08.2006 20: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

Seid ihr auch schon wix'r? xD
Avatar user-255
24.08.2006 21: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: user-251el hat dich überholt frech

Those who can, do. Those who can't, teach. # Musik gehört dem Volk! # last.fm
Avatar user-182
25.08.2006 12: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.

- Dieses Array sortieren.

leichter gesagt als geschrieben frech
wie meinste das genau?

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

Seid ihr auch schon wix'r? xD
Avatar user-255
25.08.2006 13:22

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

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

Those who can, do. Those who can't, teach. # Musik gehört dem Volk! # last.fm
Avatar user-182
26.08.2006 07:59

Böö dangöö user-255, usort() wars lächeln

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;
}
?>

Seid ihr auch schon wix'r? xD