[PHP] Tellen occurences in een array

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • ViNyL
  • Registratie: Augustus 2001
  • Niet online
Ik heb een script gemaakt wat uit een text file de username van iemand opslaat in een array. Nu kan het zijn dat de username er meerdere keren in voorkomt.
Omdat ik dat niet wil heb ik met wat zoek werk een stukkie code gevonden wat een nieuwe array aanmaakt, daar de eerste occurence van een string in stopt en als deze nogmaals voorkomt niet.

Maar wat ik nu eigenlijk wel wil is dat ik weet hoe vaak de string voorkwam in mijn eerste array.

Nu is er binnen PHP een functie substr_count maar daar kom ik niet ver mee omdat ik niet goed weet of ik dat wel op mijn array kan toepassen.

Heeft iemand een idee om dit op te lossen? Kan ik bijvoorbeeld in de nieuwe array die gemaakt wordt een teller steeds ophogen als de waarde weer voorkomt. En hoe kan ik dat precies doen, in mijn eerste array een tweede lege waarde meegeven en die later in de nieuwe array steeds ophogen als de string voorkomt?

Hieronder mijn huidige code:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
$filename = "logs/".$_POST['logbestanden'];
$seperator = ",";
$lines = file($filename);
    // loop door text file
    foreach ($lines as $line) {
        $line = rtrim($line);
        // haal de regel uit elkaar
        $user = explode($seperator, $line);
        $username = substr($user[7],0,-4);
        $user_array[] = array('username' => strtolower($username));     
    }

    $new = array();
    $exclude = array("");
    for ($i = 0; $i<=count($user_array)-1; $i++) {
         if (!in_array(trim($user_array[$i]['username']),$exclude)) { 
            $new[] = $user_array[$i];
            $exclude[] = trim($user_array[$i]['username']); 
        }
    }
    
    sort($new);
     
    foreach($new as $key => $value) {
         echo $value['username']."<br/>";
    }

Acties:
  • 0 Henk 'm!

  • Webgnome
  • Registratie: Maart 2001
  • Laatst online: 06:21
Ik weet even niet goed wat je wilt

wil je
Maar wat ik nu eigenlijk wel wil is dat ik weet hoe vaak de string voorkwam in mijn eerste string.
of wil je van een array weten of er een waarde al in staat?

Strava | AP | IP | AW


Acties:
  • 0 Henk 'm!

  • ViNyL
  • Registratie: Augustus 2001
  • Niet online
Webgnome schreef op dinsdag 24 februari 2009 @ 15:47:
Ik weet even niet goed wat je wilt

wil je


[...]


of wil je van een array weten of er een waarde al in staat?
Ik heb een array, $users, nu wil ik weten hoe vaak in die array bijvoorbeeld "vinyl" voorkomt. Dat is eigenlijk wat ik bedoel.

Zat een type in me eerste post, dat "string" moest "array" zijn.. :)

[ Voor 8% gewijzigd door ViNyL op 24-02-2009 15:50 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Waarom controleer je niet in je eerste foreach al of de username in de array bestaat en hou dan naast de array met username ook een occurences bij.

je userarray ziet er dan zo uit:
code:
1
2
3
4
5
6
user_array (
    array( 'username'   => strtolower($username), 
           'occurences' => 1),
    array( ... ),
    ...
)

als een username dan al bestaat hoog je occurences op.

Acties:
  • 0 Henk 'm!

  • MueR
  • Registratie: Januari 2004
  • Laatst online: 14:53

MueR

Admin Tweakers Discord

is niet lief

Via een omweg doet array_count_values() wel wat je wilt.

Anyone who gets in between me and my morning coffee should be insecure.


Acties:
  • 0 Henk 'm!

  • ViNyL
  • Registratie: Augustus 2001
  • Niet online
Daar heb ik eerder ook al naar gekeken. Als ik bijvoorbeeld doe:
PHP:
1
print_r(array_count_values($user_array));

Dan staat er alleen maar:

PHP:
1
Array()


Doe ik soms iets fout?

Acties:
  • 0 Henk 'm!

Verwijderd

Dit komt waarschijnlijk omdat jou array, ook arrays bevat als waarden.
Als je alleen de username er in zet:
code:
1
$user_array[] = strtolower($username);

werkt array_count_values($user_array) wel.

Acties:
  • 0 Henk 'm!

  • ViNyL
  • Registratie: Augustus 2001
  • Niet online
Verwijderd schreef op dinsdag 24 februari 2009 @ 16:01:
Dit komt waarschijnlijk omdat jou array, ook arrays bevat als waarden.
Als je alleen de username er in zet:
code:
1
$user_array[] = strtolower($username);

werkt array_count_values($user_array) wel.
Zag het net ook al staan, had het even uitgezocht.

Door dat ik nu de waardes in een array heb kan ik met de volgende functie per username checken hoe vaak deze bestaat in de array:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
function count_repeat_values($needle, $haystack){
   
    $x = count($haystack);
   
    for($i = 0; $i < $x; $i++){
       
        if($haystack[$i] == $needle){
            $needle_array[] = $haystack[$i];
        }
    }
   
    $number_of_instances = count($needle_array);
   
    return $number_of_instances;
}

[ Voor 39% gewijzigd door ViNyL op 24-02-2009 16:10 ]


Acties:
  • 0 Henk 'm!

  • MBV
  • Registratie: Februari 2002
  • Laatst online: 20-09 22:44

MBV

Als je ze allemaal wilt weten zou ik het zo doen:
PHP:
1
array_count_values(array_keys($array));


Jouw variant zal sneller zijn als je maar 1 naam wilt weten.

Acties:
  • 0 Henk 'm!

  • user109731
  • Registratie: Maart 2004
  • Niet online
Waarom zet je de waarden eerst in $needle_array? Het lijkt me handiger om in de loop gewoon een tellertje op te hogen en die terug te geven :)

Wat ook nog kan:
PHP:
1
$count = count(array_keys($hackstack, $needle));

Stuk korter en waarschijnlijk sneller :)
Pagina: 1