Visualizzazione dei risultati da 1 a 9 su 9
  1. #1
    Utente di HTML.it L'avatar di Neocron
    Registrato dal
    Jul 2002
    Messaggi
    524

    [Array associativi] Leggere al contrario

    Salve ragazzi, ho un problema dal quale non riesco ad uscirne.

    Ho un array associativo così

    [Chiave] => array(el1, el2, el3, el4)
    [Chiave2] => array(el1, el2, el3, el4)
    [Chiave3] => array(el1, el2, el3, el4)
    [Chiave4] => array(el1, el2, el3, el4)

    Dove, naturalmente, a posto degli zeri c'è una stringa.

    Per iterarlo in modo normale, dall'inizio alla fine, uso il costrutto:

    while ( list($id, $data) = each($MyArray) ) { ... }

    ok, fin qui tutto bene, ma se volessi iterare lo stesso array al contrario?

    Sto cercando i costrutti php che mi permettano di farlo, per ora, ho creato
    una sorta di array_reverse() che però vuole essere solo un espediente per
    ovviare al problema, ma grava sulle performance.

    Inoltre ho notato l'esistenza delle funzioni current() end() prev() di iterazione,
    ma non sono riuscito ad applicarle per ritrovarmi un costrutto analogo al precendente.

    ... help!

  2. #2
    Fai un for al contrario e poi ad ogni campo di un array associ una variabile (se davvero ti serve)

  3. #3
    Potresti postare il risultato di var_export applicato al tuo array?
    Per quale motivo devi "iterare" sull'array nell'ordine inverso?
    Perchè non puoi semplicemente applicare array_reverse()?

  4. #4
    Utente di HTML.it L'avatar di Neocron
    Registrato dal
    Jul 2002
    Messaggi
    524
    Quando aggiungi un valore ad un array associativo, questo viene aggiunto alla sua fine. Quindi sfruttando questo fatto "fisiologico" degli array, hai un elenco ordinato in modo crescente degli elementi: all'ultimo posto trovi l'ultimo elemento aggiunto.

    Ho bisogno di risalire alla stessa lista ma in modo decrescente, quindi mostrare l'ultimo elemento aggiunto come primo e a seguire in modo cronologico. Non posso applicare ksort o krsort perchè verrebbero ordinate le chiavi in modo arbitrario all'algoritmo, sfasando l'ordine di inserimento.

    Sono interessato ad ottimizzare il codice, è controproducente mettere in memoria, anche se in modo temporaneo, un'altro array per rigirarlo. Su array di grande dimensione, sprecheresti il doppio della ram del server.

  5. #5
    Utente di HTML.it L'avatar di Neocron
    Registrato dal
    Jul 2002
    Messaggi
    524
    Originariamente inviato da filippo.toso
    Potresti postare il risultato di var_export applicato al tuo array?
    cos'è var_export? un direttiva di PHP?

  6. #6
    In pratica si tratta di una implementazione di tipo LIFO: Last In First Out.
    A questo punto penso tu debba usare un for al contrario. Il consumo di risorse sarebbe uguale a quando si scorre l'array con un for "incrementale".
    Anzichè andare avanti, vai indietro (e ti associ le variabili del caso).
    Al massimo è il codice che è più lunghetto, perchè anzichè dare un solo comando (che comunque ne contiene altri al suo interno) dovrai implementare il for, l'associazione ecc.

  7. #7
    Originariamente inviato da Neocron
    Ho bisogno di risalire alla stessa lista ma in modo decrescente, quindi mostrare l'ultimo elemento aggiunto come primo e a seguire in modo cronologico.
    Studiati questo codice:

    Codice PHP:
    <pre>
    <?php 
    $array 
    range('A''F');

    end($array);
    do {
        
    $element key($array) . ' => ' current($array) . "\r\n";
        print(
    $element);
    } while(
    prev($array) !== false);

    ?>
    </pre>

  8. #8
    Utente di HTML.it L'avatar di Neocron
    Registrato dal
    Jul 2002
    Messaggi
    524
    Originariamente inviato da ZoneForum
    In pratica si tratta di una implementazione di tipo LIFO: Last In First Out.
    A questo punto penso tu debba usare un for al contrario. Il consumo di risorse sarebbe uguale a quando si scorre l'array con un for "incrementale".
    Anzichè andare avanti, vai indietro (e ti associ le variabili del caso).
    Al massimo è il codice che è più lunghetto, perchè anzichè dare un solo comando (che comunque ne contiene altri al suo interno) dovrai implementare il for, l'associazione ecc.
    Si, io lo farei volentieri un for al contrario:

    for($i=(count($arr)-1); $i>=0; $i--) {

    // ma qui, come rintraccio la chiave associativa?
    // $arrAssoc[$i] non esiste...

    }

  9. #9
    Utente di HTML.it L'avatar di Neocron
    Registrato dal
    Jul 2002
    Messaggi
    524
    Originariamente inviato da filippo.toso
    Studiati questo codice:

    Codice PHP:
    <pre>
    <?php 
    $array 
    range('A''F');

    end($array);
    do {
        
    $element key($array) . ' => ' current($array) . "\r\n";
        print(
    $element);
    } while(
    prev($array) !== false);

    ?>
    </pre>
    Esattamente quello che chiedevo, un codice pulito, professionale e senza appesantimenti.

    filippo.toso sei un virtuoso della programmazione ;-)

    grazie infinite!

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.