Contare valori uguali di un array e dividerli in una stringa

  • Creatore Discussione Creatore Discussione Monital
  • Data di inizio Data di inizio

Monital

Utente Attivo
15 Apr 2009
778
2
18
Buonasera.

Avrei una necessità su un array. conosco i vari comandi con array_values etc però non riesco a interagire il tutto

poniamoa d esempio di avere un array risultante cosi composto

PHP:
$nomi=array("Michele","Michele","Paolo");

io dovrei contare gli elementi uguali nel'array(se ce ne sono) e ragguparli in una stringa per farlo diventare

PHP:
$nuovinomi=Michele(2),Paolo.

al momento con l'implode sono risucito solo a fare

PHP:
$nuovinomi=Michele,Michele,Paolo.

pensavo di fare $contonomi=array_count_values($nomi)però no so come dividerlo epr poi portarlo a stringa

potrei usare array_value o array search, ma sempre non so come portarmelo poi per fare la stringa che cerco

suggerimenti?
 
Ammetto che la mia idea è molto discutibile e artigianale ma vista l'ora non ho saputo dare di più

mi scuso in anticipo anche se funzionale


PHP:
<?php

$nomi = array("Michele", "Michele", "Pietro", "Pietro", "Paolo", "Paolo", "Paolo", "Aldo");

$stringa = array();
foreach ($nomi as $key => $value) {
    if (!in_array($value, $nomi)) {
        $stringa[] = $value;
    } else {
        $c = array_count_values($nomi);
        $n = $c[$value];
        $stringa[array_search($value, $nomi)] = $value . "(" . $n . ")";
    }
}
$stringa = implode(',', $stringa);

echo $stringa;

// output Michele(2),Pietro(2),Paolo(3),Aldo(1)
?>
 
Si può anche togliere la if all'interno del ciclo che non serve

cosi è più pulito

PHP:
<?php

$nomi = array("Gianni","Aldo","Michele", "Pietro", "Michele", "Pietro", "Pietro", "Paolo", "Paolo", "Paolo", "Aldo","Gianni");

$stringa = array();
foreach ($nomi as $value) {
        $c = array_count_values($nomi);
        $n = $c[$value];
        $stringa[array_search($value, $nomi)] = $value . "(" . $n . ")";   
}
$stringa = implode(',', $stringa);

echo $stringa;

// output Gianni(2),Aldo(2),Michele(2),Pietro(3),Paolo(3)
?>
 
Si può anche togliere la if all'interno del ciclo che non serve

cosi è più pulito

PHP:
<?php

$nomi = array("Gianni","Aldo","Michele", "Pietro", "Michele", "Pietro", "Pietro", "Paolo", "Paolo", "Paolo", "Aldo","Gianni");

$stringa = array();
foreach ($nomi as $value) {
        $c = array_count_values($nomi);
        $n = $c[$value];
        $stringa[array_search($value, $nomi)] = $value . "(" . $n . ")";   
}
$stringa = implode(',', $stringa);

echo $stringa;

// output Gianni(2),Aldo(2),Michele(2),Pietro(3),Paolo(3)
?>


funziona alla grande. Grazie

una chicca però se volessi escludere l'(1) cioè quando trova un elemento unico non deve mettere l'1

si può?
 
Una soluzione veloce potrebbere essere questa

PHP:
<?php

$nomi = array("Gianni", "Michele", "Pietro", "Michele", "Pietro", "Pietro", "Paolo", "Paolo", "Paolo", "Aldo", "Gianni");

$stringa = array();
foreach ($nomi as $value) {
    //
    $c = array_count_values($nomi);
    $n = $c[$value];
    if ($n == 1) {
        $stringa[array_search($value, $nomi)] = $value;
    } else {
        $stringa[array_search($value, $nomi)] = $value . "(" . $n . ")";
    }
}

$stringa = implode(',', $stringa);

echo $stringa;

// output Gianni(2),Michele(2),Pietro(3),Paolo(3),Aldo
?>
 
ci avevo pensato però credo che facendo cosi basta che ne trovi uno con valore n=1 per valorizzare la prima ipotesi

nona vevo modo di provare prima ma dopo ti so dire se funge
 
perfetto eprfetto

grazie tante. mi hai eprmesso dir isolvere un bug del mios cript :beer::beer::beer:

p.s

vedoc he sei ferrato in materia di stringhe posso chiedere un altra cosa? non è impostante ma se risucissi a farla non sarebbe male

se l'array risultante dall'esempio su
PHP:
echo $stringa;

// output Gianni(2),Michele(2),Pietro(3),Paolo(3),Aldo

mi trovo
PHP:
echo $stringa;

// output Gianni_Neri(2),Michele_Pasotre(2),Pietro_Virdis(3),Paolo_Melegatti(3),Aldo_Busi
ed oltre a fare quanto sopra volessi eliminare _Neri e _Virdis etc?

al momento dopo il tuo cionsiglio di cui sopra mi limito a un str_replace del _ con uno spazio vuoto, con substr o strpos potreir isolvere ma dovrei fargli capire che deve cancellarmi partendo dal _ fino al valore successivo

rendendomi la stringa pulita

PHP:
echo $stringa;

// output Gianni(2),Michele(2),Pietro(3),Paolo(3),Aldo
 
Potrebbe funzionare cosi

PHP:
<?php
$nomi = array("Gianni_uno", "Pietro_due", "Michele_tre", "Pietro_due", "Pietro_due", "Aldo_quattro", "Gianni_uno");

$stringa = array();
foreach ($nomi as $value) {
    
    $exp = explode('_', $value);
    $solo_nome = $exp[0];
    
    $c = array_count_values($nomi);   
    $n = $c[$value];

    if ($n == 1) {
        $stringa[array_search($value, $nomi)] = $solo_nome;
    } else {
        $stringa[array_search($value, $nomi)] = $solo_nome . "(" . $n . ")";
    }
}

$stringa = implode(',', $stringa);

echo $stringa;

// output Gianni(2),Pietro(3),Michele,Aldo
?>

se ho capito bene
 
cririrc grazie del supporto

cmq preso cosi com'è funge ma con l'array che mi arriva questa parte dell'explode non funziona

l'array chemia rriva e composto cosi

PHP:
array([0]=>Michele_Peri [1]=>Giovanni_Mela [2]=>Giovanni_Mela)


etc...

ed ho usatoil codice da te postato così
PHP:
$nomi=$mioarray///derivante da un form

foreach ($nomi as $value) {
   
    $c = array_count_values($nomi);   
    $n = $c[$value];

    if ($n == 1) {
        $stringa[array_search($value, $nomi)] = $value;
    } else {
        $stringa[array_search($value, $nomi)] = $value. "(" . $n . ")";
    }
}

$stringa = implode(',', $stringa);

$stringa=str_replace("_"," ",$stringa);

echo $stringa;

cosi mi elenca Michele Peri(2),Giovanni Mela

susando l'explode come da esempio preceednte(e tolgiendo il str_replace) mi restituisce la stessa cosa
 
avevi notato anche la modifica in queste righe?

PHP:
if ($n == 1) {
        $stringa[array_search($value, $nomi)] = $solo_nome;
    } else {
        $stringa[array_search($value, $nomi)] = $solo_nome . "(" . $n . ")";
    }
 
avevi notato anche la modifica in queste righe?

PHP:
if ($n == 1) {
        $stringa[array_search($value, $nomi)] = $solo_nome;
    } else {
        $stringa[array_search($value, $nomi)] = $solo_nome . "(" . $n . ")";
    }


sisi l'ho messo così come lo hai postato e controllato più volte

magari faccio un altro tentativo forse sbaglioq aulcosa
 
Mi sembrava strano perchè l'avevo testato

al massimo posta quello che hai scritto
 
si la'vevo testato anche io come lo avevi ppostato e funzioanva bene però nellos cript pareva non riconoscere _

ec'era un perchè

non mi sono accorto che anche nel file che inviava l'array aveva un str_replace quindi l'array arrivava già pulito

provato ora e funziona tutto da Dio

grazie criric

a buon rendere
 

Discussioni simili