Visualizzazione dei risultati da 1 a 7 su 7

Discussione: [ARRAY] ordinare dati

  1. #1

    [ARRAY] ordinare dati

    Salve a tutti... vi pongo un quesito per vedere se qualcuno ha un metodo più veloce del mio per risolvere il problema.
    Ho 2 array, uno composto da un indice ed una coppia di dati associativi:

    Codice PHP:
    $arr[0]["label"]="Label 0";
    $arr[0]["valore"]="Valore 0";
    $arr[1]["label"]="Label 1";
    $arr[1]["valore"]="Valore 1";

    ...

    $arr[$n]["label"]="Label ".$n;
    $arr[$n]["valore"]="Valore ".$n
    e l'altro un array molto semplice:

    Codice PHP:
    $arr_sel[0]="Valore 3";
    $arr_sel[1]="Valore 7"
    Io vorrei ordinare il primo array in modo che i dati contenuti nel secondo array fossero i primi.
    Ora io l'avrei risolta ciclando tutti i valori del primo facendo una ricerca se il valore era contenuto nel secondo. Se contenuto lo inserivo in un altro array ed alla fine facendo la differenza tra il 1° array e quello ottenuto dal ciclo trovavo tutti i dati non presenti nel secondo array che quindi potevo unire per avere l'array completo ed ordinato.
    Qualcuno di voi farebbe in modo differente?
    La fantasía, abandonada de la razón, produce monstruos imposibles; unida con ella es madre de las artes y origen de las maravillas.
    (Francisco Goya)
    ----------------------------------------
    http://www.mangioebevo.it
    http://www.definitives.org

  2. #2
    se ti vuoi divertire: http://www.php.net/manual/en/function.usort.php potresti vedere se riesci a realizzare una logica di comparazione dei dati.
    IP-PBX management: http://www.easypbx.it

    Old account: 2126 messages
    Oldest account: 3559 messages

  3. #3
    giusto perchè non avevo nulla da fare:

    Codice PHP:
    <?php

    $arr 
    = array();
    for(
    $i=0;$i<20;$i++)
        
    $arr[$i]=array('label'=>"Label $i",'valore'=>$i);

    $arr_sel = array(3,7,1);


    //output: ordinare $arr in maniera che gli elementi di valore contenuto in $arr_sel siano in testa

    function cmp($a,$b){
        global 
    $arr_sel;
        
    $in_a in_array($a['valore'],$arr_sel);
        
    $in_b in_array($b['valore'],$arr_sel);

        if(!
    $in_a && !$in_b) return 0//l'ordinamento dei valori non 
                        //contenuti in $arr_sel è indifferente

        
    if($in_a && $in_b)
            return 
    $a['valore'] == $b['valore'] ? 
                (
    $a['valore']<$b['valore'] ? -1);
         
        if(
    $in_a) return -1;
            
        return 
    1;
    }
    echo 
    "prima:\n";
    print_r($arr);

    echo 
    "dopo:\n";
    //print_r($arr);

    //o usi:
    //usort($arr,'cmp');
    //oppure se la tua versione di php lo supporta:

    usort($arr, function ($a,$b) use(&$arr_sel){

        
    $in_a in_array($a['valore'],$arr_sel);
        
    $in_b in_array($b['valore'],$arr_sel);

        if(!
    $in_a && !$in_b) return 0//l'ordinamento dei valori non 
                        //contenuti in $arr_sel è indifferente

        
    if($in_a && $in_b)
            return 
    $a['valore'] == $b['valore'] ? 
                (
    $a['valore']<$b['valore'] ? -1);
        
        if(
    $in_a) return -1;
            
        return 
    1;
    });

    print_r($arr);

    ?>
    IP-PBX management: http://www.easypbx.it

    Old account: 2126 messages
    Oldest account: 3559 messages

  4. #4
    come funziona la seconda versione? quella con USE?
    La fantasía, abandonada de la razón, produce monstruos imposibles; unida con ella es madre de las artes y origen de las maravillas.
    (Francisco Goya)
    ----------------------------------------
    http://www.mangioebevo.it
    http://www.definitives.org

  5. #5
    Io l'avevo risolto così... ma è sempre da verificare se è la cosa migliore

    Codice PHP:
    $arr = array();
    for(
    $i=0;$i<20;$i++)
        
    $arr[$i]=array('label'=>"Label $i",'valore'=>$i);

    $arr_sel = array(3,7,1);

    //----------------------------------

    $arrTmp=array();
    $arrTmp2=array();
    $cont_i=0;
    $cont_i2=0;
    foreach(
    $arr as $item){
     
    $tmp=$item["valore"];
     if(
    array_search($tmp,$arr_sel)===false){
      
    $arrTmp2[$cont_i2]["label"]=$item["label"];
      
    $arrTmp2[$cont_i2]["valore"]=$item["valore"];
      
    $cont_i2++;
     }else{
      
    $arrTmp[$cont_i]["label"]=$item["label"];
      
    $arrTmp[$cont_i]["valore"]=$item["valore"];
      
    $cont_i++;
     }
    }

    $arr_ordinato=array_merge((array)$arrTmp,(array)$arrTmp2); 
    Era possibile metterlo in una funzione in effetti... e per ora non l'ho fatto, ma basta pensare ad una funzione che ha come parametro i 2 array e come uscita l'array ordinato
    Che ne pensate? Critiche e consigli?
    La fantasía, abandonada de la razón, produce monstruos imposibles; unida con ella es madre de las artes y origen de las maravillas.
    (Francisco Goya)
    ----------------------------------------
    http://www.mangioebevo.it
    http://www.definitives.org

  6. #6
    la seconda funzione è una funzione anonima che accede alla "variabile globale" $arr_sel grazie alla clausola use

    usando usort, il costo computazionale è legato strettamente all'implementazione dell'algoritmo di ordinamento usato dal metodo, che immagino sia efficiente (non mi pare che nel manuale ci sia scritto quale usi). La tua versione aumenta il costo probabilmente visto che ti leghi inesorabilmente all'iterazione dell'array, aumenti l'uso della memoria creando gli array d'appoggio, ricorri ad array_merge (che non so come sia implementato) che sicuramente aggiunge altro costo computazionale al tutto.

    Detto questo, le differenze di "costi" sono minime (su piccoli insiemi), ma vuoi mettere che è molto più da coatto usare il metodo che t'ho proposto io?
    IP-PBX management: http://www.easypbx.it

    Old account: 2126 messages
    Oldest account: 3559 messages

  7. #7
    penso che comunque la tua sia più efficiente e quindi provo ad implementarla, oltre che mi hai convinto sul coatto!
    La fantasía, abandonada de la razón, produce monstruos imposibles; unida con ella es madre de las artes y origen de las maravillas.
    (Francisco Goya)
    ----------------------------------------
    http://www.mangioebevo.it
    http://www.definitives.org

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.