Visualizzazione dei risultati da 1 a 10 su 10
  1. #1

    Cercare chiavi ripetute in un array

    Salve! Stò costruendo un sistema di internalizzazione formato da un array a cui ad ogni chiave è assegnata una traduzione. Ad es:
    Codice PHP:
    $lang = array(
       
    //header.tpl
       
    "home" => "Home",
       
    "profile" => "Profile",
       
    "missions_desc" => "Earn money and gain experience."); 
    Vorrei verificare, dato che le frasi sono circa 300-400, se per sbaglio qualche chiave viene riutilizzata. Il problema è che non sembra esserci modo di poter manipolare l'array per tal fine, in quanto PHP automaticamente "cancella" la prima chiave e la sostituisce alla seconda, facendo sempre risultare un'unica chiave.

    L'unica soluzione che mi viene in mente è aprire il file che contiene la traduzione in lettura e cercando le chiavi (dato che sono sempre poste, e quindi identificate, tra " e " =>) per vedere se sono state già utilizzate, ma il metodo come è facile immagine è abbastanza macchinoso...

    Conoscete qualche metodo più "ortodosso" ?

  2. #2

  3. #3
    Prima di tutto grazie della risposta, anche se non risolve il problema. Come ho scritto nel primo messaggio php sosituisce la prima chiave con una seconda se la trova. Ad es.
    Codice PHP:
    $ads = array("1" => 0"1" => 1);
    print_r($ads); //Risultato Array ( [1] => 1 ) 
    Quindi array_key_exists() non serve in quanto mi dice solo che una chiave esiste (e questo lo sò già XD) invece ciò che mi serve sapere è se la chiave è stata usata due o più volte.

    Mentre array_unique() non mi serve in quanto non sono i valori che mi interessano ma solo le chiavi.

    Edit: Ah ovviamente mi andrebbe bene anche un warning o notice in compilazione se fosse possibile!

  4. #4
    Utente di HTML.it
    Registrato dal
    Sep 2010
    Messaggi
    570
    non puoi impedire quel comportamento di php.
    l'unica cosa che posso dirti di fare è controllare che la chiave non esiste già prima di eventualmente sovrascriverla.

  5. #5
    Utente di HTML.it
    Registrato dal
    Sep 2010
    Messaggi
    570
    non puoi impedire quel comportamento di php.
    l'unica cosa che posso dirti di fare è controllare che la chiave non esiste già prima di eventualmente sovrascriverla.

    edit: messaggio doppio, sorry

  6. #6
    dato che non mi è possibile controllare man mano visto che l'array è scritto manualmente mi sa che a meno di qualche soluzione da qualche guru PHP dovrò controllarlo col sistema detto nel primo messaggio!

  7. #7
    Utente di HTML.it
    Registrato dal
    Sep 2010
    Messaggi
    570
    anche se è scritto manualmente niente ti impedisce di far fare il controllo:

    Codice PHP:
    class arrayHolder {
      private 
    $array = array();

      public function 
    addElement($key$value) {
        if (
    array_key_exists($key$this->array)) {
          throw new 
    Exception('chiave già presente');
        }
        
    $this->array[$key] = $value;
      }

    }

    # e poi quando realmente generi l'array usi la classe
    $array = new arrayHolder();
    $array->addElement('1''prova'); 
    è scritto così su due piedi, non rispondo di errori di sintassi :P

  8. #8
    si questa è già una soluzione ti ringrazio. Se qualcuno comunque conoscesse un metodo diretto (magari settando qualche parametro del php.ini) si faccia comunque avanti

  9. #9
    Ecco la classe completa se interessa a qualcuno:
    Codice PHP:
    class Internalization {
        public 
    $debug true;
        private 
    $array = array();
        
        public function 
    addPhrase($key$value
        {
            if(
    $this->debug) {
                
    $this->elementExist($value);
                
    $this->keyExist($key);            
            }
            
    $this->array[$key] = $value;
        }
        
        public function 
    generateTranslation()
        {
            return 
    $this->array;
        }
            
        private function 
    elementExist($element)
        {
            if(
    in_array($element,$this->array)) {
                throw new 
    Exception($element.' Element already used.');
            } 
        }
        
        private function 
    keyExist($key)
        {
            if(
    array_key_exists($key$this->array)) {
              throw new 
    Exception($key.' Key already used.');
            }
        }

    Ho aggiunto la variabile debug così da evitare i controlli nel momento in cui la traduzione è finita e aggiunto il controllo anche sul valore. Spero sia utile a chi si trova nel mio stesso caso!

  10. #10
    Utente di HTML.it
    Registrato dal
    Sep 2010
    Messaggi
    570
    setta debug come private, non ti interessa che sia modificabile direttamente.
    se proprio devi farla modificare usa un'encapsulation come per array ^^

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.