Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 12
  1. #1
    Utente di HTML.it
    Registrato dal
    Mar 2013
    Messaggi
    313

    convertire array multidimensionale in singolo array senza foreach

    Salve sto creando una funzione abbastanza complessa per gestire moltissimi dati su un database, leggendo il mio db mi viene fuori un array multidimensionale strutturato nel seguente modo :

    codice:
    Array
    (
        [0] => Array
            (
                [Tables_in_database] => db1_arca_articoli
                [Table_type] => BASE TABLE
            )
    
        [1] => Array
            (
                [Tables_in_database] => db1_arca_articoli_attributo
                [Table_type] => BASE TABLE
            )
    
        [2] => Array
            (
                [Tables_in_database] => db1_arca_articoli_categoria
                [Table_type] => BASE TABLE
            )
    
        ... 
        [69] => Array
            (
                [Tables_in_database] => sop2_opz_pro
                [Table_type] => BASE TABLE
            )
    
    )
    E dovrebbe diventare così

    codice:
    Array(db1_arca_articoli,db1_arca_articoli_attributo,db1_arca_articoli_categoria,sop2_opz_pro)
    HO già utilizzato foreach per fare questa cosa e funziona alla grande,
    però ora visto che ho a che fare con tantissimi dati, avrei bisogno di qualche altra soluzione per non rallentare il sistema.

    Esiste qualche funzione nativa di php per fare questa cosa ?

  2. #2
    Moderatore di PHP L'avatar di Alhazred
    Registrato dal
    Oct 2003
    Messaggi
    12,509
    Direi che per ciclare su un array l'unica è usare foreach.

  3. #3
    una cosa tipo

    Codice PHP:

    $originale 
    = ...quello che hai postato...;

    print_rarray_map(function($el){ return $el['Tables_in_database']; }, $originale) ); 
    IP-PBX management: http://www.easypbx.it

    Old account: 2126 messages
    Oldest account: 3559 messages

  4. #4
    Utente di HTML.it L'avatar di badaze
    Registrato dal
    Jun 2002
    residenza
    Lyon
    Messaggi
    5,372
    Quote Originariamente inviata da Santino83_02 Visualizza il messaggio
    una cosa tipo

    Codice PHP:

    $originale 
    = ...quello che hai postato...;

    print_rarray_map(function($el){ return $el['Tables_in_database']; }, $originale) ); 
    Complimenti.
    Ridatemi i miei 1000 posts persi !!!!
    Non serve a nulla ottimizzare qualcosa che non funziona.
    Cerco il manuale dell'Olivetti LOGOS 80B - www.emmella.fr

  5. #5
    Moderatore di PHP L'avatar di Alhazred
    Registrato dal
    Oct 2003
    Messaggi
    12,509
    Ma array_map() eseguirà comunque un ciclo sull'array, se l'intento è solo velocizzare le operazioni (ed è questo che vuole se ho ben capito), così non si risolve nulla, si scrive solo codice più pulito.

  6. #6
    Quote Originariamente inviata da Alhazred Visualizza il messaggio
    Ma array_map() eseguirà comunque un ciclo sull'array, se l'intento è solo velocizzare le operazioni (ed è questo che vuole se ho ben capito), così non si risolve nulla, si scrive solo codice più pulito.
    non avevo letto tutta la richiesta cmq come era effettivamente logico, foreach è piu veloce di array_map (leggevo qua e là commenti in merito, tipo http://stackoverflow.com/questions/1...tatic-function )
    IP-PBX management: http://www.easypbx.it

    Old account: 2126 messages
    Oldest account: 3559 messages

  7. #7
    Utente di HTML.it L'avatar di badaze
    Registrato dal
    Jun 2002
    residenza
    Lyon
    Messaggi
    5,372
    Forse cosi. Ma è più veloce del foreach ?

    Codice PHP:
    <?php
    $arr 
    = Array( 
    Array ( 
    'Tables_in_database' => 'db1_arca_articoli','Table_type' => 'BASE TABLE'),    
    Array ( 
    'Tables_in_database' => 'db1_arca_articoli_attributo''Table_type' => 'BASE TABLE' ), 
    Array ( 
    'Tables_in_database' => 'db1_arca_articoli_categoria''Table_type' => 'BASE TABLE' ),
    Array ( 
    'Tables_in_database' => 'sop2_opz_pro''Table_type' => 'BASE TABLE' ));
    //
    $foo=print_r($arr true);
    //
    $pattern '/\[Tables_in_database\]\s\=\>(.*)\n/';
    //
    preg_match_all($pattern,$foo,$arr2);
    print_r($arr2[1]);
    ?>


    codice:
    Array
    (
        [0] =>  db1_arca_articoli
        [1] =>  db1_arca_articoli_attributo
        [2] =>  db1_arca_articoli_categoria
        [3] =>  sop2_opz_pro
    )
    Ridatemi i miei 1000 posts persi !!!!
    Non serve a nulla ottimizzare qualcosa che non funziona.
    Cerco il manuale dell'Olivetti LOGOS 80B - www.emmella.fr

  8. #8
    Utente di HTML.it
    Registrato dal
    Feb 2014
    residenza
    Voltati
    Messaggi
    913
    badaze, hai trovato una soluzione che è "velocissima"

    Risultato dei test (ogni cosa è ripetuta 1'000'000 volte):
    codice:
    Test con array_map(): 5.0269999504089s
    Test con print_r() e preg_match_all(): 41.491999864578s
    Test con foreach: 1.6000001430511s
    Codice dei test:
    Codice PHP:
    <?php
    $array 
    = [["Tables_in_database"=>"db1_arca_articoli","Table_type"=>"BASE TABLE"],["Tables_in_database"=>"db1_arca_articoli_attributo","Table_type"=>"BASE TABLE"],["Tables_in_database"=>"db1_arca_articoli_categoria","Table_type"=>"BASE TABLE"],["Tables_in_database"=>"sop2_opz_pro","Table_type"=>"BASE TABLE"]];

    echo 
    "Test con array_map(): ";
    $start microtime(true);
    $i 1000000// 1'000'000
    while ($i--) {
        
    array_map(function($el) {
            return 
    $el["Tables_in_database"];
        }, 
    $array);
    }
    echo 
    microtime(true) - $start "s\n";

    echo 
    "Test con print_r() e preg_match_all(): ";
    $start microtime(true);
    $i 1000000// 1'000'000
    while ($i--) {
        
    $pattern "/\[Tables_in_database\]\s\=\>(.*)\n/";
        
    $string print_r($arraytrue);
        
    preg_match_all($pattern$string$result);
    }
    echo 
    microtime(true) - $start "s\n";

    echo 
    "Test con foreach: ";
    $start microtime(true);
    $i 1000000// 1'000'000
    while ($i--) {
        
    $result = [];
        foreach (
    $array as $arr) {
            
    $result[] = $arr["Tables_in_database"];
        }
    }
    echo 
    microtime(true) - $start "s\n";
    Ultima modifica di tampertools; 11-11-2014 a 16:58
    No

  9. #9
    Utente di HTML.it L'avatar di badaze
    Registrato dal
    Jun 2002
    residenza
    Lyon
    Messaggi
    5,372
    Grazie. Provero' a fare meglio la prossima volta. Ma è senza foreach.
    Ridatemi i miei 1000 posts persi !!!!
    Non serve a nulla ottimizzare qualcosa che non funziona.
    Cerco il manuale dell'Olivetti LOGOS 80B - www.emmella.fr

  10. #10
    il foreach è l'unica soluzione ihmo perchè è l'unico che punta tutto solo su ArrayIterator che va a puntatori. più veloci ed efficienti di così non ne hai in php penso
    IP-PBX management: http://www.easypbx.it

    Old account: 2126 messages
    Oldest account: 3559 messages

Tag per questa discussione

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 © 2026 vBulletin Solutions, Inc. All rights reserved.