PHP: Session rekursiv auslesen, Key aktualisieren und zurück in Session

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • PHP: Session rekursiv auslesen, Key aktualisieren und zurück in Session

    Hi,

    neben mir sitzt gerade das kreative Nichts.
    Ich lese mit PHP einen Zielordner rekursiv aus. Ergebnis bei aufgerufener URL "/browse.php/HOME%27s%20Land/test%20und%20so":

    Quellcode

    1. Array
    2. (
    3. [0] => Array
    4. (
    5. [_SortID] => 2
    6. [_DirectoryPath] => ./_root/content/[002]COMPANY
    7. [_UserInputPath] => /browse.php/COMPANY
    8. [_CompareInputPath] => /COMPANY
    9. [_PathDepth] => 0
    10. [_Condition] => offline
    11. [_ParentFolder] => content
    12. [_Folder] => [002]COMPANY
    13. [_DisplayName] => COMPANY
    14. [_Type] => DIR
    15. [DIR_Content] =>
    16. )
    17. [1] => Array
    18. (
    19. [_SortID] => 1
    20. [_DirectoryPath] => ./_root/content/[001]HOME's Land
    21. [_UserInputPath] => /browse.php/HOME%27s%20Land
    22. [_CompareInputPath] => /HOME's Land
    23. [_PathDepth] => 0
    24. [_Condition] => online
    25. [_ParentFolder] => content
    26. [_Folder] => [001]HOME's Land
    27. [_DisplayName] => HOME's Land
    28. [_Type] => DIR
    29. [DIR_Content] => Array
    30. (
    31. [0] => Array
    32. (
    33. [_SortID] => 0
    34. [_DirectoryPath] => ./_root/content/[001]HOME's Land/[000]test und so
    35. [_UserInputPath] => /browse.php/HOME%27s%20Land/test%20und%20so
    36. [_CompareInputPath] => /HOME's Land/test und so
    37. [_PathDepth] => 1
    38. [_Condition] => online
    39. [_ParentFolder] => [001]HOME's Land
    40. [_Folder] => [000]test und so
    41. [_DisplayName] => test und so
    42. [_Type] => DIR
    43. [DIR_Content] =>
    44. )
    45. )
    46. )
    47. )
    Alles anzeigen


    Um das nicht jedes Mal beim Seitenaufruf neu machen zu müssen (Serverkapazitäten sind ja auch nicht grenzenlos), dachte ich dass alles in einer Session zu notieren.

    Bei meinem Problem, geht es um den Key "Condition". Condition ist entweder "online" oder "offline". Je nachdem, welcher GET-Parameter übergeben wurde, wird bereits beim auslesen der Festplatte in das Array eingetragen, ob der Ordner und dessen übergeordnete Ordner aufgerufen und dessen Inhalt später dargestellt wird (online) - oder nicht (offline). Diesen Wert benötige ich später beim Erstellen der Navigation, da diese global (ähnlich einer Sitemap) aufgebaut wird. Ich denke, das Prinzip ist verständlich.

    Beim Übernehmen stieß ich dann auf folgendes Problem:
    Die Session muss man aktualisieren: Sonst stimmt der über die URL eingegebene Pfad nicht mit dem im Array als "online" bezeichneten Pfad überein, weil ja nun der Stand in der Session abgespeichert ist, der beim Auslesen der Festplatte aktuell war.

    Also: eine neue Funktion muss her. In meinem PHP steht jetzt das:

    Quellcode

    1. function refresh_session($arr) {
    2. #session rekursiv auslesen
    3. for ($i = 0; $i < count($arr); $i++){
    4. $arr[$i]['TEST'] = (count($arr[$i]['DIR_Content']) != 0) ? "online" : "offline";
    5. //'TEST', um zu sehen, wo ich grad bin.
    6. //iwie funzt das nur teiweise, weil beim nächsten Auruf dieser Funktion wieder alles weg ist, weil ich nicht weiß,
    7. //an welcher Stelle ich das nun in die Session schreiben müsste
    8. //oder schreibt mal alles in ein komplett neues Array und überschreibt die Session mit diesem?
    9. #rec call:
    10. count($arr[$i]['DIR_Content']) != 0 ? refresh_session($arr[$i]['DIR_Content']) : NULL;
    11. }
    12. return $arr;
    13. }
    14. function go_session(){
    15. if(isset($_SESSION['SERVER_HDD'])){
    16. $SERVER_HDD = refresh_session($_SESSION['SERVER_HDD']);
    17. } else {
    18. $_SESSION['SERVER_HDD'] = read_dir();
    19. $SERVER_HDD = $_SESSION['SERVER_HDD'];
    20. }
    21. return $SERVER_HDD;
    22. }
    23. echo "<pre style=\"font-size: 10px;\">";
    24. #Festplatteninhalt ausgeben
    25. print_r(go_session());
    26. echo "</pre>";
    Alles anzeigen




    Für die Funktion refresh_session() bin ich grad iwie zu blöd:
    Ich lese sie zwar rekursiv aus, aber ich weiß im Moment nicht, wie ich die aktualisierten Daten wieder in die Session bekomme. Denn ich müsste ja irgendwie den Pfad innerhalb der Session kennen:
    $_SESSION[irgendeinTiefLiegendesArray]['Condition'] = "new condition";

    Ich dreh mich gerade im Kreis. Weil ich über den Ansatz, die Session rekursiv auszulesen, nicht hinauskomme. Wäre dankbar für Anregungen.

    lg icronosonic
  • Öfter mal ein Glas O-Saft trinken... nicht immer nur Kaffee :)
    Dennoch... ich bin nicht wirklich zufrieden mit dieser Lösung:

    Quellcode

    1. function refresh_session($session_data) {
    2. #session rekursiv auslesen
    3. for ($i = 0; $i < count($session_data); $i++){
    4. $array[$i] = array(
    5. '_SortID' => $session_data[$i]['_SortID'],
    6. '_DirectoryPath' => $session_data[$i]['_DirectoryPath'],
    7. '_UserInputPath' => $session_data[$i]['_UserInputPath'],
    8. '_CompareInputPath' => $session_data[$i]['_CompareInputPath'],
    9. '_PathDepth' => $session_data[$i]['_PathDepth'],
    10. '_Condition' => compareExplodeString(getUserInputString($session_data[$i]['_DirectoryPath'], ""), countPathDepth($session_data[$i]['_DirectoryPath'])-countPathDepth(____STARTDIR____)),
    11. '_ParentFolder' => $session_data[$i]['_ParentFolder'],
    12. '_Folder' => $session_data[$i]['_Folder'],
    13. '_DisplayName' => $session_data[$i]['_DisplayName'],
    14. '_Type' => $session_data[$i]['_Type'],
    15. '_ExistsCheck' => $session_data[$i]['_ExistsCheck'],
    16. '_Size' => $session_data[$i]['_Size'],
    17. '_Mod_E' => $session_data[$i]['_Mod_E'],
    18. '_Mod_R' => $session_data[$i]['_Mod_R'],
    19. '_Mod_W' => $session_data[$i]['_Mod_W'],
    20. '_Time_A' => $session_data[$i]['_Time_A'],
    21. '_Time_C' => $session_data[$i]['_Time_C'],
    22. '_Time_M' => $session_data[$i]['_Time_M'],
    23. );
    24. if(count($session_data[$i]['DIR_Content']) != 0) $array[$i]['DIR_Content'] = refresh_session($session_data[$i]['DIR_Content']);
    25. }
    26. return $array;
    27. }
    28. function go_session(){
    29. if(isset($_SESSION['SERVER_HDD'])){
    30. $_SESSION['SERVER_HDD'] = refresh_session($_SESSION['SERVER_HDD']);
    31. $SERVER_HDD = $_SESSION['SERVER_HDD'];
    32. } else {
    33. $_SESSION['SERVER_HDD'] = read_dir();
    34. $SERVER_HDD = $_SESSION['SERVER_HDD'];
    35. }
    36. return $SERVER_HDD;
    37. }
    Alles anzeigen


    Gibt es etwas dafür eventuell etwas Eleganteres? Oder ist es generell so, dass man jeden Key einzelnen rüberkopieren muss?


    lg und ein schönes WE
    icronosonic™