Visualizzazione risultati 1 fino 8 di 8

Discussione: Cercare valore in array e restituire array corrispondente

  1. #1
    L'avatar di miki92
    miki92 non è connesso AlterGuru 2500
    Data registrazione
    21-04-2007
    Residenza
    Procida (NA)
    Messaggi
    4,226

    Predefinito Cercare valore in array e restituire array corrispondente

    Buongiorno,
    ho diversi array ed ho bisogno di cercare se un valore esiste in questi array e a quale array appartiene... per farvi capire vi posto un codice di esempio:

    Codice PHP:

    $array_a
    = array("081","082","083");
    $array_b = array("085","086","087");
    $array_c = array("089");

    foreach(
    $abc as $c => $k){

    // controllo di $k in quale array si trova

    }

    Spero di essermi spiegato. Qualsiasi soluzione è accettata. L'unica cosa è capire in quale dei tre array esiste nel modo più veloce possibile senza dover eseguire un if con in_array()
    Apprezzi l'aiuto? Offrimi un caffè!

  2. #2
    L'avatar di Luffio
    Luffio non è connesso Utente attivo
    Data registrazione
    02-07-2006
    Messaggi
    439

    Predefinito

    Non ti piace proprio
    Codice PHP:
    $arrays = array('array_a','array_b','array_c');
    $found = array();

    foreach(
    $abc as $c => $k)
    foreach(
    $arrays as $a)
    if(
    in_array($k, $$a))
    $found[] = $k;

    print_r($found);
    ...no?

    Codice PHP:
    $arrays = array('array_a', 'array_b', 'array_c');
    $result = $db = array();

    foreach(
    $arrays as $a){
    $i=0;
    foreach($
    $a as $aa)
    $db["$a_".($i++)] = $aa;
    }

    foreach(
    $abc as $c => $k)
    $result[$k] = preg_replace('/_[^_]+$/', '', array_search($k, $db));

    print_r($result);
    Luffio Web Site, Luffio's personal site
    Age Of Empires GIF, sito per la creazione di GIF animate di Age of Empires
    Clan italiano di Age of Empires The Conquerors, uno dei più vecchi ancora attivi

  3. #3
    L'avatar di miki92
    miki92 non è connesso AlterGuru 2500
    Data registrazione
    21-04-2007
    Residenza
    Procida (NA)
    Messaggi
    4,226

    Predefinito

    La quantità di dati potrebbe essere enorme e avere due cicli non la vedo tanto positiva come cosa... sarebbe meglio un if con 3 in_array a questo punto non credi?
    Apprezzi l'aiuto? Offrimi un caffè!

  4. #4
    L'avatar di javascripter
    javascripter non è connesso Moderatore
    Data registrazione
    14-02-2010
    Messaggi
    1,114

    Predefinito

    Una soluzione carina è quella di fissare un indice valido per tutti gli array, fare un controllo su tutti gli array su questo indice aumentandolo di passo in passo:
    $array1[$i] === $elemento ,
    $array2[$i] === $elemento ,
    ...,
    $arrayN[$i] === $elemento .

    In questo modo hai un solo ciclo che muove l'indice (finché è inferiore al massimo della lunghezza dei 3 array), all'interno fai i controlli sui tuoi 3 array.
    Volendo si può fare una soluzione generica valevole per N array (non solo 3), in tal caso bisogna usare un altro ciclo (innestato); in ogni caso la complessità computazionale dell'algoritmo è invariata.

    Devi muovere l'indice un numero massimo di max(count($array1), count($array2), count($array3)) e fare 3 controlli per capire dove si trova l'elemento.

    Per farti un esempio di algoritmo:
    Codice PHP:
    $array1 = array(5,5,7,9);
    $array2 = array(2,4,6,8,10);
    $array3 = array(11,13,15,17,19,51,68,21);

    $arrays = array($array1, $array2, $array3);
    $limit = max(count($array1), count($array2), count($array3)); // l'indice non può andare oltre a questo valore
    $needle = 21; // elemento da trovare (questo è il caso pessimo, l'elemento da trovare è in coda)
    $found = false; // conterrà l'esito della ricerca
    $i = 0;

    while(
    $i < $limit && $found === false) {
    foreach(
    $arrays as $n => $array) {
    if(isset(
    $array[$i])) {
    if(
    $array[$i] === $needle) {
    $found = $n;
    break;
    }
    } else {
    // rimuove l'array tra gli 'arrays', in questo modo le iterazioni su di esso si riducono al prossimo $i
    unset($arrays[$n]);
    }
    }

    $i++;
    }

    var_dump($found);
    In questo caso l'array più lungo è $array3 con 8 elementi ($limit = 8).
    Il foreach innestato ciclerà su 3 array e man mano che l'indice supererà la loro lunghezza verranno rimossi da $arrays, questo implica meno iterazioni la prossima voltà che verrà raggiunto il foreach.
    Nel momento in cui l'elemento è stato trovato, si esce subito fuori dal ciclo.

    Per fare qualche conto, in totale abbiamo bisogno di circa max(5, 5, 8) * 3 (24) iterazioni per trovare l'elemento nella posizione più scomoda, ma 2 per trovare l'elemento in posizione ottima (primo del primo array). Negli altri casi dipende dalla posizione, ma comunque è minore di 24.

  5. #5
    L'avatar di miki92
    miki92 non è connesso AlterGuru 2500
    Data registrazione
    21-04-2007
    Residenza
    Procida (NA)
    Messaggi
    4,226

    Predefinito

    Minghia che casino... il mio timore è che lo script su server lenti o in caso di grande quantità di dati occupi troppa memoria o vada in timeout.
    Apprezzi l'aiuto? Offrimi un caffè!

  6. #6
    L'avatar di Luffio
    Luffio non è connesso Utente attivo
    Data registrazione
    02-07-2006
    Messaggi
    439

    Predefinito

    E che script laborioso hai? Non ti conviene usare un database? :D
    Luffio Web Site, Luffio's personal site
    Age Of Empires GIF, sito per la creazione di GIF animate di Age of Empires
    Clan italiano di Age of Empires The Conquerors, uno dei più vecchi ancora attivi

  7. #7
    L'avatar di miki92
    miki92 non è connesso AlterGuru 2500
    Data registrazione
    21-04-2007
    Residenza
    Procida (NA)
    Messaggi
    4,226

    Predefinito

    No. Lo script deve agire solo su dati che raccoglie al momento.
    Comunque sto studiando varie soluzioni. Per adesso sto sviluppando una funzione che faccia ciò che mi occorre e temporaneamente utilizzo un if con 3 elseif.
    Apprezzi l'aiuto? Offrimi un caffè!

  8. #8
    L'avatar di Luffio
    Luffio non è connesso Utente attivo
    Data registrazione
    02-07-2006
    Messaggi
    439

    Predefinito

    Se non ti è di troppo disturbo, posso sapere che progetto hai in mente di fare? :P
    Luffio Web Site, Luffio's personal site
    Age Of Empires GIF, sito per la creazione di GIF animate di Age of Empires
    Clan italiano di Age of Empires The Conquerors, uno dei più vecchi ancora attivi

Regole di scrittura

  • Non puoi creare nuove discussioni
  • Non puoi rispondere ai messaggi
  • Non puoi inserire allegati.
  • Non puoi modificare i tuoi messaggi
  •