php array access

Linguaggi di programmazione: php, perl, python, C, bash e tutti gli altri.
Avatar utente
SuperStep
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 2037
Iscrizione: lunedì 19 dicembre 2011, 16:26
Desktop: Unity
Distribuzione: Ubuntu 16.04 LTS x86_64
Sesso: Maschile
Località: Somma Vesuviana (NA)

php array access

Messaggio da SuperStep »

salve,

supponendo che ho un array di questo tipo:

Codice: Seleziona tutto

$a = array(
  'a1' => array(
    'b1' => array(
      
    ),
    'b2' => array(

    ),
    'bx' => $a['a1']['b1']+$a['a1']['b2'],
  ),

  'a2' => array(
   ...someting
  ),
);
è possibile assegnare a bx ARRAY1 + ARRAY2 (una qualsiasi operazione generica)
ed esiste un modo per eseguire un operatore ternario?
è possibile accedere ad [a1][b1] da bx senza specificare tutto il path?

lo so che queste cose in genere si fanno con gli oggetti, ma sto cercando di realizzare dei file di configurazione dinamici, che generino delle regole in base a dei contenuti.
ubuntu 16.04 LTS 64-bit - Memoria: 31,3 Gib - Processore: Intel Core i7-5960X CPU @ 3.00 GHz × 16 - Grafica: AMD Radeon HD 7800 Series - Disco: SSD 256 GB x 4 (RAID 01)
Avatar utente
Zoff
Moderatore Globale
Moderatore Globale
Messaggi: 33338
Iscrizione: mercoledì 10 ottobre 2007, 22:36

Re: php array access

Messaggio da Zoff »

SuperStep ha scritto:è possibile assegnare a bx ARRAY1 + ARRAY2 (una qualsiasi operazione generica)
Sì:

Codice: Seleziona tutto

$a = array(
  'a1' => array(
    'b1' => array(
     
    ),
    'b2' => array(

    ),
  ),

  'a2' => array(
   ...someting
  ),
);
$a['a1']['bx'] = $a['a1']['b1']+$a['a1']['b2'];
SuperStep ha scritto:ed esiste un modo per eseguire un operatore ternario?
Come sopra, prima inizializzi l'array poi:

Codice: Seleziona tutto

$a = ....;
$a['a1']['bx'] = $a['a1']['b1']>$a['a1']['b2'] ? 'foo' : 'bar';
SuperStep ha scritto:è possibile accedere ad [a1][b1] da bx senza specificare tutto il path?
No.
Prima di aprire una discussione leggi le Guide, poi vedi se c'è un HowTo nel Wiki e fai una ricerca nel Forum!
Applica semplicemente il [Risolto]! Prova: http://forum.ubuntu-it.org/viewtopic.php?f=70&t=548821
Vuoi qualcosa di piu' dal forum? Prova i miei script: http://forum.ubuntu-it.org/viewtopic.php?f=70&t=597066
Avatar utente
SuperStep
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 2037
Iscrizione: lunedì 19 dicembre 2011, 16:26
Desktop: Unity
Distribuzione: Ubuntu 16.04 LTS x86_64
Sesso: Maschile
Località: Somma Vesuviana (NA)

Re: php array access

Messaggio da SuperStep »

sono su laravel e avrei la necessità di generare le regole di validazione dinamicamente

questo è un file che ho creato io in "app/config" chiamato "validator.php"

Codice: Seleziona tutto

<?php

$validator = array(

    /*
    |--------------------------------------------------------------------------
    | tables rules
    |--------------------------------------------------------------------------
    |
    | This file containt the rules of database table
    |
    */
    'table' => array(
        
        /** 
         * admins table
         */
        'admin' => array(
        
        ),
        
        /**
         * companys table
         */
        'company' => array(
        
        ),
        
        /**
         * consultants table
         */
        'consultant' => array(
        
        ),
        
        /**
         * managers table
         */
        'manager' => array(
        
        ),
        
        /**
         * users table
         */
        'user' => array(
                        
            /** 
             * email field
             */
            'email' => array(
                'required' => true,
                'format' => 'email',
                'minlenght' => 5,
                'maxlenght' => 320,
            ),
            
            /**
             * password field
             */
            'password' => array(
                'required' => true,
                'format' => 'alpha_num',
                'minlenght' => 4,
                'maxlenght' => 30,
            ),
            
            /**
             * actor field
             */
            'actor' => array(
                
            ),
        )
    ),
        
    /*
    |--------------------------------------------------------------------------
    | rules
    |--------------------------------------------------------------------------
    |
    | This is the self constructor
    |
    */
    
    'rule' => array(
        'user' => call_user_func(
            function($table){
                var_dump($table);
                return $table;
            },
            $validator),
            //Config::get('validator.table.user)),
    )
);

return $validator;
adesso in (array di rule) se metto config::get(validator.table.user') pare andare in loop; ed il browser mi restituisce nessun dato ricevuto.

effettivamente se io mettessi al posto di 'validator.table.user' > 'validator.rule.user' la funzione chiamerebbe tante volte se stessa all'infinito, quindi mi viene da pensare che il metodo Config::get() analizzi sempre ogni frammento dell'array .

provando ad assegnare l'array ad una variabile "validator" e provando ad accedere tramite $validator['table']['user'], il debuggher del framework mi risponde:

Codice: Seleziona tutto

ErrorException
Undefined variable: validator
il debuggher fa riferimento a questa riga:

Codice: Seleziona tutto

$validator['table']['user']),
non riesco a trovare un modo per passare il contenuto di:
array['table']['qualcosa'] al call_user_func di array['rules']['qualcosa']

p.s. ho già provato call_user_func_array ma non funziona lo stesso.

Qualche Suggerimento??? :muro:

(Temporaneamente ho creato questa soluzione, ma non mi piace avere due array, potrei aver bisogno di accedere a qualche dato extra della configurazione senza parsarlo, qui la soluzione)

Codice: Seleziona tutto

<?php

$validator = array(
    /*
    |--------------------------------------------------------------------------
    | tables rules
    |--------------------------------------------------------------------------
    |
    | This file containt the rules of database table
    |
    */
    
    'table' => array(
        
        /** 
         * admins table
         */
        'admin' => array(
        
        ),
        
        /**
         * companys table
         */
        'company' => array(
        
        ),
        
        /**
         * consultants table
         */
        'consultant' => array(
        
        ),
        
        /**
         * managers table
         */
        'manager' => array(
        
        ),
        
        /**
         * users table
         */
        'user' => array(
                        
            /** 
             * email field
             */
            'email' => array(
                'required' => true,
                'format' => 'email',
                'min' => 5,
                'max' => 320,
            ),
            
            /**
             * password field
             */
            'password' => array(
                'required' => true,
                'format' => 'alpha_num',
                'min' => 4,
                'max' => 30,
            ),
            
            /**
             * actor field
             */
            'actor' => array(
                'required' => true
            ),
        )
    )
);

return array(
    /*
    |--------------------------------------------------------------------------
    | tables rules
    |--------------------------------------------------------------------------
    |
    | This file containt the rules of database table
    |
    */
    
    'user' => array(
        'email' => call_user_func(
            function ($field){
                $rule = parseValidator($field);
                return $rule;
            }
            , $validator['table']['user']['email']),
        
        'password' => call_user_func(
            function ($field){
                $rule = parseValidator($field);
                return $rule;                
            }
            , $validator['table']['user']['password']),
            
        'actor' => call_user_func(
            function ($field){
                $rule = parseValidator($field);
                return $rule;
            }
            , $validator['table']['user']['actor']),
    )
);

function parseValidator($table){
    $rule = null;
    
    foreach($table as $key => $value){
        switch($key){
            case 'required':
                if($value){
                    $rule = (!empty($rule)) ? 'required|'.$rule : 'required';
                }
            break;
            
            case 'format':
                $rule = (!empty($rule)) ? $rule.'|'.$value : $value;
            break;
            
            case 'min':
                $rule = (!empty($rule)) ? $rule.'|min:'.$value : 'min:'.$value;
            break;
            
            case 'max':
                $rule = (!empty($rule)) ? $rule.'|max:'.$value : 'max:'.$value;
            break;
        }   
    }
    return $rule;
}
ubuntu 16.04 LTS 64-bit - Memoria: 31,3 Gib - Processore: Intel Core i7-5960X CPU @ 3.00 GHz × 16 - Grafica: AMD Radeon HD 7800 Series - Disco: SSD 256 GB x 4 (RAID 01)
Avatar utente
Zoff
Moderatore Globale
Moderatore Globale
Messaggi: 33338
Iscrizione: mercoledì 10 ottobre 2007, 22:36

Re: php array access

Messaggio da Zoff »

Sinceramente non capisco il tuo approccio.
Perché non fai come dice nella documentazione?
Prima di aprire una discussione leggi le Guide, poi vedi se c'è un HowTo nel Wiki e fai una ricerca nel Forum!
Applica semplicemente il [Risolto]! Prova: http://forum.ubuntu-it.org/viewtopic.php?f=70&t=548821
Vuoi qualcosa di piu' dal forum? Prova i miei script: http://forum.ubuntu-it.org/viewtopic.php?f=70&t=597066
Avatar utente
SuperStep
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 2037
Iscrizione: lunedì 19 dicembre 2011, 16:26
Desktop: Unity
Distribuzione: Ubuntu 16.04 LTS x86_64
Sesso: Maschile
Località: Somma Vesuviana (NA)

Re: php array access

Messaggio da SuperStep »

sostanzialmente per alcuni motivi;

1) per avere un file di configurazione unico, e non dover scrivere per ogni input che segue un campo della tabella una nuova regola.
2) per poter modificare tramite interfaccia le regole (tranne quelle di sicurezza) a cui i vari campi devono sottostare.
3) in modo da dover mettere solo i valori e non dover scrivere ogni volta quella noiosissima e lunga stringa in ogni file, accedendoci direttamente con un Conf::get(configurazione.nometabella.nomeattributo);

in un progetto precedente la gestione dei validator è stata una cosa terribile; sviluppando con alcuni colleghi, ci siamo accorti che in ogni modulo, ognuno di noi utilizzava regole tutte sue, hahaha, un'esperienza terribile.
ubuntu 16.04 LTS 64-bit - Memoria: 31,3 Gib - Processore: Intel Core i7-5960X CPU @ 3.00 GHz × 16 - Grafica: AMD Radeon HD 7800 Series - Disco: SSD 256 GB x 4 (RAID 01)
Avatar utente
Zoff
Moderatore Globale
Moderatore Globale
Messaggi: 33338
Iscrizione: mercoledì 10 ottobre 2007, 22:36

Re: php array access

Messaggio da Zoff »

Allora la soluzione migliore secondo me non è creare un mega array incontrollabile ma generare gli array dinamicamente o ancora meglio creare un validatore vostro che fa da wrapper per quelli esistenti
Prima di aprire una discussione leggi le Guide, poi vedi se c'è un HowTo nel Wiki e fai una ricerca nel Forum!
Applica semplicemente il [Risolto]! Prova: http://forum.ubuntu-it.org/viewtopic.php?f=70&t=548821
Vuoi qualcosa di piu' dal forum? Prova i miei script: http://forum.ubuntu-it.org/viewtopic.php?f=70&t=597066
Avatar utente
SuperStep
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 2037
Iscrizione: lunedì 19 dicembre 2011, 16:26
Desktop: Unity
Distribuzione: Ubuntu 16.04 LTS x86_64
Sesso: Maschile
Località: Somma Vesuviana (NA)

Re: php array access

Messaggio da SuperStep »

sembra una buona soluzione;

ma come genero gli array dinamicamente?

sostanzialmente facendo Config::get('validator.nometabella.nomecampo') ottengo un output la regola del campo di quella tabella,
è la gestione dietro che è un pò grossa.
ubuntu 16.04 LTS 64-bit - Memoria: 31,3 Gib - Processore: Intel Core i7-5960X CPU @ 3.00 GHz × 16 - Grafica: AMD Radeon HD 7800 Series - Disco: SSD 256 GB x 4 (RAID 01)
Avatar utente
Zoff
Moderatore Globale
Moderatore Globale
Messaggi: 33338
Iscrizione: mercoledì 10 ottobre 2007, 22:36

Re: php array access

Messaggio da Zoff »

Dipende da come generi i form da validare.
Prima di aprire una discussione leggi le Guide, poi vedi se c'è un HowTo nel Wiki e fai una ricerca nel Forum!
Applica semplicemente il [Risolto]! Prova: http://forum.ubuntu-it.org/viewtopic.php?f=70&t=548821
Vuoi qualcosa di piu' dal forum? Prova i miei script: http://forum.ubuntu-it.org/viewtopic.php?f=70&t=597066
Scrivi risposta

Ritorna a “Programmazione”

Chi c’è in linea

Visualizzano questa sezione: 0 utenti iscritti e 13 ospiti