Visualizzazione risultati 1 fino 14 di 14

Discussione: preg_match_all e array_unique

  1. #1
    blackskyisback non è connesso Utente attivo
    Data registrazione
    29-05-2012
    Messaggi
    452

    Predefinito preg_match_all e array_unique

    Salve a tutti

    dovrei estrarre l'anno da una data (e ci sono riuscito) da un campo date e visualizzare l'anno senza duplicati, ho provato con array_unique e varie combinazioni, ma niente



    2022-12-18
    2019-09-21
    2018-08-06

    Codice PHP:
    <?php



    $ok
    = $row->died;

    $ok2 = $row->conteggio;


    preg_match_all('/([\d]{4})/', $ok, $matches);

    $matches = array_unique($matches[0]);


    foreach (
    $matches as $data2) {

    ?>



    <link rel="stylesheet" href="css/pretty-checkbox.min.css">

    <div class="pretty p-default p-round">
    <input type="checkbox" name="year" value="<?php echo $data2;?>">
    <div class="state p-success-o">
    <label>
    <?php echo '&nbsp;' . '<a style="color:grey">' . $data2 . '</a>' . " (" . $ok2 . ")" . '&nbsp;';?>
    </label>
    </div>
    </div>


    <?php

    }

    }

    ?>

  2. #2
    darbula non è connesso AlterGuru 2500
    Data registrazione
    24-04-2011
    Messaggi
    2,894

    Predefinito

    Sempre come l'altra discussione per espressioni regolari la chiave del pattern tra parentesi tonde è n° che inizia con 1 poiché 0 indica tutta la regex. In realtà ti occorre preg_match non preg_match_all poiché la regex è una per volta dentro un ciclo foreach. preg_match_all si usa per altro. Poiché ti occorre array a più dimensioni è sufficiente creare $i = 0;
    $my_array[$i] = $matches[0]; // che la stringa originale è una data
    $i++; alla fine del foreach di preg_match per avanzare il puntatore
    poi dopo la fine del ciclo preg_match $resultmatch = array_unique($my_array);
    E ovviamente se vuoi output da debug che ti indica anche array tipo e il valore corrispondente var_dump($resultmatch);
    Ultima modifica di darbula : 21-12-2022 alle ore 15.04.10

  3. #3
    blackskyisback non è connesso Utente attivo
    Data registrazione
    29-05-2012
    Messaggi
    452

    Predefinito

    Citazione Originalmente inviato da darbula Visualizza messaggio
    Sempre come l'altra discussione per espressioni regolari la chiave del pattern tra parentesi tonde è n° che inizia con 1 poiché 0 indica tutta la regex. In realtà ti occorre preg_match non preg_match_all poiché la regex è una per volta dentro un ciclo foreach. preg_match_all si usa per altro. Poiché ti occorre array a più dimensioni è sufficiente creare $i = 0;
    $my_array[$i] = $matches[0]; // che la stringa originale è una data
    $i++; alla fine del foreach di preg_match per avanzare il puntatore
    poi dopo la fine del ciclo preg_match $resultmatch = array_unique($my_array);
    E ovviamente se vuoi output da debug che ti indica anche array tipo e il valore corrispondente var_dump($resultmatch);

    ho fatto cosi ma il risultato non cambia, valori sempre doppi



    Codice PHP:

    $ok
    = $row->died;

    $ok2 = $row->conteggio;


    preg_match('/([\d]{4})/', $ok, $matches);

    $i = 0;

    $my_array[$i] = $matches[0];

    $i++;

    $resultmatch = array_unique($my_array);

    //var_dump($resultmatch);

    foreach ($resultmatch as $data2) {

    ...........
    Ultima modifica di blackskyisback : 21-12-2022 alle ore 15.37.34

  4. #4
    darbula non è connesso AlterGuru 2500
    Data registrazione
    24-04-2011
    Messaggi
    2,894

    Predefinito

    $resultmatch devi crearlo dopo la chiusura del foreach. Lì è l'output atteso non per ogni iterazione se dentro il ciclo. Dopo avere controllato che è senza duplicati puoi pensare come inserirlo in un ciclo (ma solo dopo altrimenti non capisci perché non funziona).
    Inoltre la matrice $my_array contiene i valori del ciclo poiché a ogni iterazione stai creando una chiave $i diversa.
    Ultima modifica di darbula : 21-12-2022 alle ore 16.17.24

  5. #5
    blackskyisback non è connesso Utente attivo
    Data registrazione
    29-05-2012
    Messaggi
    452

    Predefinito

    senza foreach e con var_dump visualizzo questo, sempre con valori doppi







    Codice PHP:
    preg_match('/([\d]{4})/', $ok, $matches);

    $i = 0;

    $my_array[$i] = $matches[0];

    $i++;

    $resultmatch = array_unique($my_array);

    var_dump($resultmatch);

  6. #6
    darbula non è connesso AlterGuru 2500
    Data registrazione
    24-04-2011
    Messaggi
    2,894

    Predefinito

    Fai finta che il tuo script è questo https://3v4l.org/RRlkZ vedi è senza duplicati array_unique quindi significa stai giocando a golf in codice. Su questo non ti posso aiutare mi dispiace
    Devi essere tu a replicare il risultato atteso è impossibile spiegare qualcosa che non conosci e anche provandoci ugualmente ottengo una risposta non faccio questo di mestiere troverò un'altra soluzione. In realtà il senso è con codice poco chiaro e con la sintassi a blocchi che rende più complessa la lettura del codice di conseguenza ti confonde ancora di più le tue idee (occorre semplicità per i primi passi, altrimenti forse fai semplicemente copia e incolla non investendo il tuo tempo sul codice e si traduce io non lo capisco o non lo so fare o non faccio questo di mestiere. Fin quando non personalizzi per la maggior parte con tuo codice a me mi sta bene che conosci il significato di echo ((string) 2 +2); // 4, mentre quando lo personalizzi per la maggior parte qualcosa devi conoscerla prima di implementarla).
    Ultima modifica di darbula : 21-12-2022 alle ore 17.46.33

  7. #7
    blackskyisback non è connesso Utente attivo
    Data registrazione
    29-05-2012
    Messaggi
    452

    Predefinito

    il codice che ho postato e' quello, prima si trova la query e poi il codice, 4 righe

    d'accordo, trovero' la soluzione da solo con il tempo

    grazie lo stesso,.
    Ultima modifica di blackskyisback : 21-12-2022 alle ore 17.46.48

  8. #8
    darbula non è connesso AlterGuru 2500
    Data registrazione
    24-04-2011
    Messaggi
    2,894

    Predefinito

    È proprio questo il punto se come il mio codice o come nel tuo è il medesimo risultato atteso, solo che non sai replicare il risultato atteso nel tuo codice.
    Dimmi sinceramente
    Codice PHP:
    $my_array = array('2020', '2020');
    non è equivalente a
    Codice PHP:
    $i = 0;
    $my_array[$i] = '2020';
    $i++;
    $my_array[$i] = '2020';
    Se entrambi iniziano da chiave zero e terminano con chiave uno con i rispettivi valori che differenza c'è? In teoria nessuna però tu con il loop fai qualcosa che sovrascrivere e non te ne rendi conto (non posso spiegarti questo, non riesco proprio non per mancanza). Se poi la tua applicazione era disponibile pubblicamente l'avrei migliorata e molte cose sostituite e quindi era sufficiente il download per te per il risultato atteso.
    Ultima modifica di darbula : 21-12-2022 alle ore 18.24.23

  9. #9
    blackskyisback non è connesso Utente attivo
    Data registrazione
    29-05-2012
    Messaggi
    452

    Predefinito

    i valori che esponi tu sono differenti dai miei, tu parti da una stringa (2020), io prendo i dati dal database nel campo date (actors.died) con questo formato
    2022-12-18
    2019-09-21
    2018-08-06
    applicazione lo postata, senza query, non c'e' molto

    eccola completa (con variante)

    Codice PHP:
    <?php
    require_once("connettipg.php");


    $actor_id = $_GET['id'];


    $query = "
    SELECT
    actors.died

    FROM
    actors
    WHERE
    actors.died NOTNULL




    "
    ;


    $result2 = pg_query($query) or die('Error message: ' . pg_last_error());

    while (
    $row = pg_fetch_object($result2)) {


    ?>


    <?php

    //$ok2 = $row->conteggio;

    $ok = $row->died;

    preg_match_all('/([\d]{4})/', $ok, $matches);

    $matches = $matches[0];

    natcasesort($matches);

    $matches = array_unique($matches);


    //var_dump($matches);

    foreach ($matches as $data2) {


    ?>





    <link rel="stylesheet" href="css/pretty-checkbox.min.css">

    <div class="pretty p-default p-round">
    <input type="checkbox" name="year" value="<?php echo $data2;?>">
    <div class="state p-success-o">
    <label>
    <?php echo '&nbsp;' . '<a style="color:grey">' . $data2 . '</a>' . " (" . $ok2 . ")" . '&nbsp;';?>
    </label>
    </div>
    </div>


    <?php

    }

    }

    ?>
    Ultima modifica di blackskyisback : 21-12-2022 alle ore 19.04.26

  10. #10
    darbula non è connesso AlterGuru 2500
    Data registrazione
    24-04-2011
    Messaggi
    2,894

    Predefinito

    Per estrarre solo la parte intera di quattro cifre e il valore solo quattro cifre. Modifica in
    Codice PHP:
    $i = 0;
    $copy[$i] = $row;
    preg_match('/([\d]{4})/', $row->died, $matches);

    $my_array[$i] = $matches[1];
    $i++;

    $resultmatch = array_unique($my_array);
    natsort($resultmatch);
    unset(
    $matches);
    }
    // fine loop $row
    natsort($copy);
    foreach(
    $copy as &$valdate) {
    //solo se viene trovato in $resultmatch, ergo data anno di quattro cifre
    if(in_array($valdate->died, $resultmatch)) {
    echo
    $valdate->died;
    }
    }
    unset(
    $valdate);
    var_dump('per test', $copy[0]->died);
    non proprio e ti spiego non esiste ritorno DateTime nativo dal database ma è una stringa in php.
    Giustamente $i è prima degli include o del loop altrimenti viene sempre reimpostata a zero a ogni iterazione e usa $copy proprietà dove vuoi il testo completo, $copy[chiave_numero]->died per il testo completo della data, utilizzo sprecando risorse natsort poiché dentro al loop $row->died che invece va usato solo dopo la chiusura del loop.
    Ma non è sufficiente perché vuoi la data in ordine crescente e array_unique reimposta la chiave. Tradotto puoi ordinare $resultmatch che è unico ma non $my_arr altrimenti duplicati.
    Ultima modifica di darbula : 21-12-2022 alle ore 21.57.17

  11. #11
    blackskyisback non è connesso Utente attivo
    Data registrazione
    29-05-2012
    Messaggi
    452

    Predefinito

    non capisco questo risultato, non e' quello che volevo

    string(8) "per test" string(10) "2014-10-20"
    ok, ci rinuncio, troppo complicato

    grazie

  12. #12
    darbula non è connesso AlterGuru 2500
    Data registrazione
    24-04-2011
    Messaggi
    2,894

    Predefinito

    Mentre così
    Codice PHP:
    $i = 0;
    $copy[$i] = $row;
    preg_match('/([\d]{4})/', $row->died, $matches);

    $my_array[$i] = $matches[1];
    $i++;

    $resultmatch = array_unique($my_array);
    natsort($resultmatch);
    unset(
    $matches);
    }
    // fine loop $row
    natsort($copy);
    foreach(
    $copy as &$valdate) {
    //Recupero le quattro cifre di anno e se sono presenti in $resultmatch stampo la data intera o parziale
    preg_match('/([\d]{4})/', $valdate->died, $matches);
    if(
    in_array($matches[1], $resultmatch) {
    echo
    $valdate->died;
    }
    }
    unset(
    $valdate);
    unset(
    $matches)
    L'output per test appunto è se almeno genera output.
    Ultima modifica di darbula : 21-12-2022 alle ore 22.30.44

  13. #13
    blackskyisback non è connesso Utente attivo
    Data registrazione
    29-05-2012
    Messaggi
    452

    Predefinito

    Risolto come l'altro thread degli ordinamenti dei numeri, partendo dall'alto, cioe' dalla query

    ma rimane il problema javascript per filtrare i dati(non so se posso postarlo qui, ma il codice e' un mix adesso)

    primo codice con la query funzionante (finalmente senza duplicati)

    Codice PHP:
    <?php
    require_once("connettipg.php");


    $query = "
    SELECT DISTINCT
    ( EXTRACT ( YEAR FROM actors.died ) ) AS dyear,
    COUNT ( COALESCE ( actors.died ) ) AS conteggio
    FROM
    actors
    WHERE
    actors.died NOTNULL
    GROUP BY
    dyear
    ORDER BY
    dyear ASC

    "
    ;


    $result = pg_query($query) or die('Error message: ' . pg_last_error());

    while (
    $row = pg_fetch_object($result)) {


    $ok = $row->dyear;
    $ok2 = $row->conteggio;

    ?>


    <div class="pretty p-default p-round">
    <input type="checkbox" name="year" value="<?php echo $ok;?>">
    <div class="state p-success-o">
    <label>
    <?php echo '&nbsp;' . '<a style="color:green">' . $ok . '</a>' . " (" . $ok2 . ")" . '&nbsp;';?>
    </label>
    </div>
    </div>


    <?php

    }

    ?>



    secondo codice javascript per filtrare i dati provienti dal checkbox ,questo non funziona, purtroppo, penso che la regex e' sbagliata

    Codice HTML:
    <script
    ....
    // start filter checkbox 	2 di 2
    
    $('input:checkbox').on('change', function () {
       //build a regex filter string with an or(|) condition
    
    // year
       var year = $('input:checkbox[name="year"]:checked').map(function() {
         return "^" + this.value + "([\d]{4})";
       }).get().join('|');
       
       //now filter in column 2, with no regex, no smart filtering, not case sensitive
       table.column(3).search(year, true, false, false).draw(false);
    
    </script>

    codice html dove dovrebbe estrarre la data, tra i 2 <td></td>

    Codice HTML:
    <td class="text-left sorting_1">2022-12-18<br>
    (deceased at age&nbsp;<font color="red">87</font>)&nbsp; &nbsp;<img src="ico/new_icon.gif" alt="new"> 
    </td>
    Ultima modifica di blackskyisback : 23-12-2022 alle ore 19.23.10

  14. #14
    blackskyisback non è connesso Utente attivo
    Data registrazione
    29-05-2012
    Messaggi
    452

    Predefinito

    risolto, da cosi

    Codice HTML:
    return "^" + this.value + "([\d]{4})";
    a cosi

    Codice HTML:
    return this.value;
    grazie a tutti

Tags for this Thread

Regole di scrittura

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