[PHP]RISOLTO: eliminazione riga con singolo valore duplicato in array

  • Creatore Discussione Creatore Discussione fabryx
  • Data di inizio Data di inizio

fabryx

Nuovo Utente
9 Ott 2016
38
2
8
1-a
2-b
3-a

come faccio ad eliminare la riga dove 'a' si ripete????
 
Ultima modifica:
ciao
scusa una cosa: sono tre arrya? es
PHP:
$uno=array(0 => 1, 1 => 'a');
$due=array(0 => 2, 1 => 'b');
$tre=array(0 => 3, 1 => 'a');
oppure uno solo
PHP:
$uno=array(0 => 1, 1 => 'a');
$uno=array(0 => 2, 1 => 'b');
$uno=array(0 => 3, 1 => 'a');
nel secondo caso gli unci valori che ti ritrovi sono 0 => 3, 1 => 'a'
 
Forse con un esempio riesco a spiegarmi meglio perche il quesito l' ho postato dopo una notte di disperazione alla ricerca di una soluzione e devo avere fatto un po di confusione.
Dunque: sto facendo il parsing di un file html racchiuso in una pagina web che chiamero' per semplicita http://www.pagina.com dove sono racchiusi i seguenti tag

HTML:
<!= altro html vario =>
<li class="track" data-ec-name="1 - valore inutile - a" data-ec-creative="altri dati>contenuto</li>
<!= altro html vario =>
<li class="track" data-ec-name="2 - valore inutile - b" data-ec-creative="altri dati>contenuto</li>
<!= altro html vario =>
<li class="track" data-ec-name="3 - valore inutile - a" data-ec-creative="altri dati">contenuto</li>
<!= altro html vario =>
quindi tramite una classe DOM (simple_html_dom.php) ho proceduto come segue per estrarre i valori del tag 'data-ec-name' :

PHP:
//includo la classe
require 'simple_html_dom.php';

// carico pagina html
$html = file_get_html('http://www.pagina.com');

// Cerco tag che mi interessa attraverso il valore dell'attributo 'class' (purtroppo sembra che la classe DOM non consideri 'data-ec-name' un attributo quindi diventa un po cervellotica a questo punto)
$codes = $html->find('li[class=track]');

//ottengo array dei risultati
foreach($codes as $code) {
//listo array
    for($i = 0; $i < count($code); $i++) {
//purtroppo la classe DOM che uso non riconosce 'data-ec-name='
//quindi cerco la porzione di stringa che mi interessa in questo modo

    $pos1 = strpos($code, 'data-ec-name=');
    $pos2 = strpos($code, ' data-ec-creative=');
    $code_str = substr($code,$pos1,$pos2-$pos1);

//rimuovo le porzioni di stringa che non mi servono
    $code_find = array('data-ec-name=', '"', ' - valore inutile - ');
    $code_replace = array('', '', '-');
//ottengo la stringa finale
    $code_string_final = str_replace($code_find, $code_replace, $code_str);
//creo la lista dei valori
    list ($code, $title) = explode("-", $code_string_final);
//stampo risultato
    echo $code .'-'. $title . '<br>';
    }
}
questo e' il risultato:

1-a
2-b
3-a

come faccio ad eliminare la riga dove 'a' si ripete????[/PHP]
 
Ultima modifica:
Ciao. prova così.
PHP:
<?php
//includo la classe
require 'simple_html_dom.php';

// carico pagina html
$html = file_get_html('example.html');

// Cerco tag che mi interessa attraverso il valore dell'attributo 'class' (purtroppo sembra che la classe DOM non consideri 'data-ec-name' un attributo quindi diventa un po cervellotica a questo punto)
$codes = $html->find('li[class=track]');


// VETTORE VALORI UNICI
$unique = array();

//ottengo array dei risultati
foreach($codes as $code) {
//listo array
    for($i = 0; $i < count($code); $i++) {
//purtroppo la classe DOM che uso non riconosce 'data-ec-name='
//quindi cerco la porzione di stringa che mi interessa in questo modo

    $pos1 = strpos($code, 'data-ec-name=');
    $pos2 = strpos($code, ' data-ec-creative=');
    $code_str = substr($code,$pos1,$pos2-$pos1);

//rimuovo le porzioni di stringa che non mi servono
    $code_find = array('data-ec-name=', '"', ' - valore inutile - ');
    $code_replace = array('', '', '-');
//ottengo la stringa finale
    $code_string_final = str_replace($code_find, $code_replace, $code_str);
//creo la lista dei valori
    list ($code, $title) = explode("-", $code_string_final);
//stampo risultato
    if (!in_array($title, $unique)) { // se il valore non esiste nell'array
        echo $code .'-'. $title . '<br>'; // lo stampo
        array_push($unique, $title); // lo aggiungo nell'array
        // non verra più stampato

    }
    }
}
?>
 
Ciao. prova così.
PHP:
<?php
//includo la classe
require 'simple_html_dom.php';

// carico pagina html
$html = file_get_html('example.html');

// Cerco tag che mi interessa attraverso il valore dell'attributo 'class' (purtroppo sembra che la classe DOM non consideri 'data-ec-name' un attributo quindi diventa un po cervellotica a questo punto)
$codes = $html->find('li[class=track]');


// VETTORE VALORI UNICI
$unique = array();

//ottengo array dei risultati
foreach($codes as $code) {
//listo array
    for($i = 0; $i < count($code); $i++) {
//purtroppo la classe DOM che uso non riconosce 'data-ec-name='
//quindi cerco la porzione di stringa che mi interessa in questo modo

    $pos1 = strpos($code, 'data-ec-name=');
    $pos2 = strpos($code, ' data-ec-creative=');
    $code_str = substr($code,$pos1,$pos2-$pos1);

//rimuovo le porzioni di stringa che non mi servono
    $code_find = array('data-ec-name=', '"', ' - valore inutile - ');
    $code_replace = array('', '', '-');
//ottengo la stringa finale
    $code_string_final = str_replace($code_find, $code_replace, $code_str);
//creo la lista dei valori
    list ($code, $title) = explode("-", $code_string_final);
//stampo risultato
    if (!in_array($title, $unique)) { // se il valore non esiste nell'array
        echo $code .'-'. $title . '<br>'; // lo stampo
        array_push($unique, $title); // lo aggiungo nell'array
        // non verra più stampato

    }
    }
}
?>

Errore:
in_array() expects parameter 2 to be array, null given in
 
ciao
da quanto ho capito l'array che devi trattare e $title, giusto?
fai un esempio concreto di come e fatto l'array, metti subito dopo la sua creazione
PHP:
var_dump($title);
e posta il risultato
vedendo concretamente quale è la struttura forse si riesce meglio a capire cosa fare
 
Hai citato il mio messaggio perché hai copiato, incollato ed eseguito il mio codice? Sicuro di aver creato il seguente vettore?
PHP:
// VETTORE VALORI UNICI
$unique = array();
 
Hai citato il mio messaggio perché hai copiato, incollato ed eseguito il mio codice? Sicuro di aver creato il seguente vettore?
PHP:
// VETTORE VALORI UNICI
$unique = array();

sembra funzionare in alcune parti ma non in altre.
possiblita' di conflitti di script ?
comunque grazie tantissimo :)
fosse per me sarei ancora in alto mare :confused:
 
Se specifichi bene cosa non funziona (il codice che esegui e l'output ricevuto) magari possiamo darci un'occhiata.
 
Se specifichi bene cosa non funziona (il codice che esegui e l'output ricevuto) magari possiamo darci un'occhiata.

Sto facendo il parsing di una pagina beatport per ottenere link e titoli delle traccie da inserire in un player visto che mi stanno facendo aspettare da un mese la key per accedere alle loro API

PHP:
<?
//Class include
require 'simple_html_dom.php';

$unique = array();
$uri = 'https://www.beatport.com/artist/avengers/203716/tracks';
    $bp_html = file_get_html($uri);
// Find track code and track title
        $bp_tracks_codes = $bp_html->find('li[class=track]');
        foreach ($bp_tracks_codes as $bp_track_code){
            $bp_t_code_pos1 = strpos($bp_track_code, 'data-ec-name="');
            $bp_t_code_pos2 = strpos($bp_track_code, '" data-ec-creative=');
            $bp_t_code_str = substr($bp_track_code,$bp_t_code_pos1,$bp_t_code_pos2-$bp_t_code_pos1);
            $bp_t_code_find = array('data-ec-name=', '"', ' - track - ');
            $bp_t_code_replace = array('', '', '-');
            $bp_track_code = str_replace($bp_t_code_find, $bp_t_code_replace, $bp_t_code_str);
            list ($track_code, $track_title) = explode("-", $bp_track_code);
//Removing duplicate entry
            if (!in_array($track_code, $unique)) {
                $audio_link = str_replace(' ', '', 'http://geo-samples.beatport.com/lofi/' . $track_code . '.LOFI.mp3');
                echo '<b>' .$track_title . '</b><br><audio preload="auto" src="' .$audio_link. '" controls="controls"></audio><hr>';
                array_push($unique, $track_code);
               
            }
        }
?>

se lo fai girare vedrai che i titoli delle track vengono ripetuti nonostante il tuo ottimo suggerimento.
ma la cosa che mi lascia veramente perplesso e' che se lo stesso script lo fai girare per questa pagina
https://www.beatport.com/artist/perceptors/352712/tracks
allora le traccie non si ripetono!
non so se ridere o piangere :(:confused:

P.s.:
non l'ho scritto perche' presumo tu sappia dove trovare il file della classe dom che sto utilizzando :)
 
ho stampato i track codes commentando tutto l'if
PHP:
    echo $track_code."<br />";

//    if (!in_array($track_code, $unique)) {
sono univoci !
 
PHP:
    echo $track_code." - ".$track_title."<br />";

//    if (!in_array($track_code, $unique))
//    {
//        $audio_link = str_replace(' ', '', 'http://geo-samples.beatport.com/lofi/' . $track_code . '.LOFI.mp3');
//        echo '<b>' .$track_title . '</b><br><audio preload="auto" src="' .$audio_link. '" controls="controls"></audio><hr>';
//        array_push($unique, $track_code);
//    }

elenco
Codice:
track    track
code    title
7591546    Beautiful Destination
8300233    Beautiful Destination
6340324    City Lights
6839203    City Lights
6633990    Connection To Space
3095788    Fuckin' Commercial Music
3095789    Fuckin' Commercial Music
3095790    Fuckin' Commercial Music
3095604    Horny Level
7726425    Intoxicated
3115838    Kdabra
7318555    Kick in Ass
2027478    Life's A Bitch
6340329    Liquid
7726424    Lost World
6633991    Nasty
3358948    Powermesh
6340328    Prog'n Roll
7008387    Prog'n Roll
6504357    Randomise
7591545    Rastafari
2027477    Revenge
2712509    Revenge
3880685    Talking
3880686    Talking
3880687    Talking
4204306    Talking
3095791    This Is Trash
3095792    This Is Trash
7726426    Tomorrow People
6504358    Trinity
7558852    Trinity
7318556    True Killer
7701586    True Killer
3095793    Warfare

come vedi i track code sono tutti differenti anche a parità di titolo
forse anziché rendere univoco il track code ti conviene agire sul titolo
ciao
 
PHP:
    if (!in_array($track_title, $unique))
    {
        $audio_link = str_replace(' ', '', 'http://geo-samples.beatport.com/lofi/' . $track_code . '.LOFI.mp3');
        echo '<b>' .$track_title . '</b><br><audio preload="auto" src="' .$audio_link. '" controls="controls"></audio><hr>';
        array_push($unique, $track_title);
    }
così ottengo titoli non duplicati
vedi se ti va bene
 
ciao
se vuoi eliminare i titolo duplicati dai un occhio
PHP:
<?php
function elimina_duplicati($a){
    for($k=0;$k<(count($a)-1);$k++){
        for($j=($k+1); $j<count($a);$j++){
            if($a[$k][1]==$a[$j][1]){
                $da_elim[$j]=$j;
            }
        }
    }
    foreach($da_elim as $chiave){
        unset($a[$chiave]);
    }
    return $a;
}
/*---test-----*/
$title[]=array(0=>'1', 1=>'a');
$title[]=array(0=>'2', 1=>'a');//uguale a 1
$title[]=array(0=>'3', 1=>'b');
$title[]=array(0=>'4', 1=>'c');
$title[]=array(0=>'5', 1=>'d');
$title[]=array(0=>'6', 1=>'e');
$title[]=array(0=>'7', 1=>'c');//uguale a 4

echo "<pre>";
var_dump(elimina_duplicati($title));
echo "<pre>";
?>
ho scritto i procedurale perche non amo la prog a oggetti comunque se ti serve la trasformi
 
@Borgo, il suo codice funziona bene, deve solo gestire il titolo nell'array "$unique" anziché il codice,
vedi mio post
(ovviamente se corrisponde al risultato atteso)
 
ciao
si,
non so cosa ne farà dell'array, ma il suo codice non stampa il duplicato il mio elimina fisicamente

dimenticavo:
il mio opera sul titolo [1], se volesse oprerare sul codice [0]
 

Discussioni simili