PHP: Parameter für array_multisort über Variable

N

nighT

Hallo Leute,

so langsam habe ich wohl eine PHP-Blockade entweickelt... Folgendes Problem:
Ich habe einen Array, den ich gerne per array_multisort sortieren würde. Nun erzeuge ich den sortier-Parameter immer dynamisch, so dass ich ihn per Variable übergeben will.
Folgende Versuche:
funktioniert nicht:
Code:
$testVar = '$arraySort[Serial], SORT_ASC';
array_multisort($testVar, $array);
funktioniert:
Code:
array_multisort($arraySort[Serial], SORT_ASC, $array);
Wie schaffe ich es, dass die erste Variante funktioniert?

Liebe Grüße,
Manuel L.
 
funktioniert nicht:
Code:
$testVar = '$arraySort[Serial], SORT_ASC';
array_multisort($testVar, $array);
Kein Wunder, $testVar enthält nun einen String und ist kein Array mehr!

funktioniert:
Code:
array_multisort($arraySort[Serial], SORT_ASC, $array);
Dass diese Variante funktioniert, ist wiederum kein Wunder, denn nun übergibst du ja ein Array (angenommen, der key 'Serial' enthält ein Array).

Ein Schönheitsfehler: Keys sind entweder Integer oder Strings -- wenn du Serial ohne Anführungszeichen schreibst, denkt PHP, das wäre eine Konstante und tut nun etwas ganz PHP-typisches (hmpf!): Anstatt einfach einen Fehler auszugeben, zeigt es eine Notice und behandelt die nicht-existierende Konstante so wie den String 'Serial' (also so, als wenn du Anführungszeichen verwendet hättest). Der obige Code funktioniert also, ist aber unsauber.

Nun zu deinem eigentlichen Problem. Was ist denn bei dir nicht dynamisch? Ist es nur der Variablenname? Dann würde das so funktionieren:
PHP:
$key = 'Serial';
$sortOrder = SORT_ASC;
// $key und $sortOrder setzt du natürlich dynamisch.

array_multisort( $arraySort[$key], $sortOrder, $array );

Ist auch der Variablenname dynamisch, kannst du das so machen:
PHP:
// Die nächsten drei Variablen setzt du auch hier dynamisch.
$varName = 'arraySort';
$key = 'Serial';
$sortOrder = SORT_ASC;

array_multisort( ${$varName}[$key], $sortOrder, $array );
 
Okay. Schon Mal vielen Dank.
Mit dem simplen Beispiel funktioniert das nun Problemlos.
Trotzdem habe ich nun noch ein Problem:
Ich erzeuge per foreach-Schleife, basierend auf einem Array, unterschiedlich viele Suchparameter. Mal keiner, mal einer, mal mehrere.
Der Variablenname ($arraySort) ist konstant. $key ändert sich dynamisch zu dem sortierenden Eintrag und die Sortorder wird dann ebenfalls dynamisch erzeugt.
Wie schaffe ich es nun also dynamisch unterschiedlich viele Kriterien in den multisort unterzubringen?
 
Hm, wie wär's denn damit (ungetestet):

PHP:
$multisort_args = array();

foreach( $arraySort as $v )
{
  $multisort_args[] = $v;
  $multisort_args[] = SORT_ASC;
}

$multisort_args[] = $array;
call_user_func_array( 'array_multisort', $multisort_args );

$multisort_args enthält einfach die Parameter für array_multisort().

Vielleicht habe ich auch nicht genau verstanden, was du eigentlich willst... :)
 
Hi,
Sorry, dass ich mich länger nicht gemeldet habe. Komme erst jetzt wieder zu diesem Problem.
Leider bekomme ich es mit deinem neuen Beispiel immer noch nicht hin. Ich kann nicht einmal genau sagen, wo der Fehler liegt. :(

Ich versuche noch mal alle nötigen Informationen zusammen zu fassen. Am besten alle Informationen, Variablennamen usw. von oben vergessen. Es hat sich dort auch einiges geändert:

Ich habe ein Array $arrresult, welches das Ergebnis der Datenbank beinhaltet (Im Beispiel 2 Einträge):
Code:
Array (
    [0] => Array (
        [ActionTime] => 09-FEB-11 09.21.45.000000 AM 
        [ActionCode] => U 
        [Serial] => 657541 
        [FirstOccurrence] => 09-FEB-11 09.16.24.000000 AM 
        [firm_objekt] => server01 
        [Summary] => WASHighResponseTime 
        [Identifier] => WASHighResponseTime:AppProduc#23:server01:KYNS:artikel-pflege:ITM_Request_Times_and_Rates 
        [LastOccurrence] => 09-FEB-11 09.21.23.000000 AM 
        [StateChange] => 09-FEB-11 09.21.23.000000 AM 
        [Acknowledged] => 0 
        [AlertGroup] => ITM_Request_Times_and_Rates 
        [Node] => AppProduc#23:server01:KYNS 
        [Tally] => 2 
        [Type] => 20 
        [ExpireTime] => 0 
        [SuppressEscl] => 0 
        [Agent] => ITM 
        [Manager] => tivoli_eif probe on oglxtion1.domain.de 
        [Severity] => 0
    ) 

    [1] => Array (
        [ActionTime] => 09-FEB-11 09.21.45.000000 AM 
        [ActionCode] => U 
        [Serial] => 657542 
        [FirstOccurrence] => 09-FEB-11 09.16.24.000000 AM 
        [firm_objekt] => server02 
        [Summary] => WASHighResponseTime 
        [Identifier] => WASHighResponseTime:AppProduc#23:server02:KYNS::ITM_Request_Times_and_Rates 
        [LastOccurrence] => 09-FEB-11 09.21.20.000000 AM 
        [StateChange] => 09-FEB-11 09.21.20.000000 AM 
        [Acknowledged] => 0 
        [AlertGroup] => ITM_Request_Times_and_Rates 
        [Node] => AppProduc#23:server02:KYNS 
        [Tally] => 2 
        [Type] => 20 
        [ExpireTime] => 0 
        [SuppressEscl] => 0 
        [Agent] => ITM 
        [Manager] => tivoli_eif probe on oglxtion1.domain.de 
        [Severity] => 0
    )
)
Dann habe ich eine Session $_SESSION['sorting'] (ebenfalls Array) welches die Sortierung beinhaltet (im Beispiel zwei Kriterien). In der Reihenfolge, in der die Einträge im Array stehen, soll auch sortiert werden. Zuerst nach Serial, dann nach FirstOccurence
Code:
Array (
    [Serial] => ASC
    [FirstOccurrence] => DESC
)
Diese beiden Array's sind die Grundlage.

Mit folgendem Code kann ich bereits speziell nach Serial sortieren:
Code:
foreach ($_SESSION['sorting'] as $sortkey => $sortrow) {
        foreach ($arrresult as $key => $row) {

            $arraySort[$sortkey][$key] = $row[$sortkey];        

        }
    }
    
    array_multisort($arraySort[Serial], SORT_DESC, $arrresult);
Wie man sieht, ist die array_multisort-Funktion im Moment direkt im Code gesetzt. Diese soll nun dynamisch erzeugt werden. Sprich die Sortierkriterien aus $_SESSION['sorting'] beinhalten. Diese Kriterien können unterschiedlich viele sein. Je nach dem, was der Anwender später auswählt.

Ich hoffe, nun sind alle nötigen Informationen angegeben und das Problem ist Sinnvoll geschildert.

Ich würde mich sehr über eine Antwort freuen - auch wenn das Problem (vielleicht) total simpel zu lösen ist. :think:

Viele Grüße,
Manuel
---------------------
Edit: Ich habe die Frage hier nochmal gestellt, da es dort im Forum wohl besser aufgehoben ist :)
Trotzdem vielen Dank für deine Hilfe.
Falls dir noch weitere Ansätze einfallen, bin ich sehr offen dafür.
 
Zuletzt bearbeitet von einem Moderator:

Ähnliche Themen

variable von einem script zum nächsten übergeben

[gelöst] [php] für Webservice aus string einzelne funktionsparameter rausholen

Squid nur zum maskieren der eigenen IP, nicht für Webserver auf port 80

Aufgabenblatt mit LaTeX - Layoutprobleme

evilWM vs Ratpoison vs Ion

Zurück
Oben