[PHP] Waardes tellen in array

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Hallo,

Ik zit met een probleem wat betreft het uitlezen van waardes in een array.

Een array heeft bij mij de volgende indeling:

$array {
[0] ==> 00
[1] ==> 20
[2] ==> 00
[3] ==> 35
[4] ==> 00
[5] ==> 20
}

Deze zou ik graag om willen zetten naar het volgende:

Sleutel Aantal
00 3
20 2
35 1

Het hoeft van mij nog niet eens in volgorde en waarschijnlijk zal het algoritme hiervoor ook niet zoo extreem moeilijk zijn, maar ik kom er gewoon niet op.

Alvast mijn hartelijke dank.

Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Ik wil je toch vriendelijk verzoeken eens een poging te wagen; dit is, als je er even voor gaat zitten wellicht, gewoon peanuts om te schrijven.

code:
1
2
3
4
5
loop door arrayX
  als waarde uit arrayX al bestaat als key in arrayY
    arrayY[waardeX]+=1
  anders
    maak nieuwe key arrayY[waardeX] en init waarde op 0

[ Voor 6% gewijzigd door RobIII op 14-10-2009 15:43 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • hostname
  • Registratie: April 2009
  • Laatst online: 17-09 17:56

Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
My God. Heeft PHP dan écht overal een functie voor? :X What happened to zelf schrijven? :+

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • Invisible_man
  • Registratie: Juni 2006
  • Nu online
Komen deze waardes uit een mySQL database? Zo ja, zou je kunnen beginnen om deze te laten sorteren (ORDER BY) op dat veld zodat je in ieder geval de zelfde waardes onder elkaar hebt. Zodra je dat hebt kan je al veel makkelijker het aantal de zelfde tellen.

Acties:
  • 0 Henk 'm!

  • Voutloos
  • Registratie: Januari 2002
  • Niet online
Dude, de query optimaliseren en niet eens count gebruiken zodat je in 1x klaar bent? 8)7

{signature}


Acties:
  • 0 Henk 'm!

  • MueR
  • Registratie: Januari 2004
  • Laatst online: 10:22

MueR

Admin Tweakers Discord

is niet lief

RobIII schreef op woensdag 14 oktober 2009 @ 15:43:
[...]

My God. Heeft PHP dan écht overal een functie voor? :X What happened to zelf schrijven? :+
Dat is overgewaardeerd. Met PHP7 komt er zelfs een nieuwe functie, magic_morph(). Dat is het enige wat je in je site hoeft te zetten, die doet alles voor je.
PHP:
1
magic_morph('halo3'); // hoppa, web based halo 3

:Y)

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


Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 17-09 14:05

.oisyn

Moderator Devschuur®

Demotivational Speaker

RobIII schreef op woensdag 14 oktober 2009 @ 15:43:
[...]

My God. Heeft PHP dan écht overal een functie voor? :X What happened to zelf schrijven? :+
Nou ja, 't is op zich geen rare functie. Wat wel weer jammer is is dat men op die manier helemaal niets meer leert :/

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • Firefly III
  • Registratie: Oktober 2001
  • Niet online

Firefly III

Bedrijfsaccount Firefly III
-

[ Voor 100% gewijzigd door Firefly III op 05-03-2016 15:33 . Reden: Leeg vanwege privacy. ]

Hulp nodig met Firefly III? ➡️ Gitter ➡️ GitHub ➡️ Mastodon


Acties:
  • 0 Henk 'm!

  • bglnelissen
  • Registratie: Maart 2006
  • Laatst online: 24-08 20:37
ik zou zoiets doen:

<?php
// initialiseer variabelen
$array_met_keys = '';

foreach ($array as $key => $value){
// checken of de $value al voorbij is gekomen
if(! in_array($value, $array_met_keys)){
// de $value is nog niet voorbij gekomen
// sla deze op in de nieuwe array met het aantal keer dat de $value voorkomt.

// zoek alle keys waarvan de value $value is.
$array_met_keys[$value] = array_keys($array, $value));
}
}

// geef output weer op scherm.
print($array_met_keys);
?>

Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 17-09 14:05

.oisyn

Moderator Devschuur®

Demotivational Speaker

Slarioux schreef op woensdag 14 oktober 2009 @ 15:54:
[...]

Dat heeft op zich niks met PHP te maken, maar met de insteek van de programmeur. En die is bij PHP vaak anders dan bij andere talen.
Sorry, maar waar zei ik dat het iets met PHP te maken had?

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • Firefly III
  • Registratie: Oktober 2001
  • Niet online

Firefly III

Bedrijfsaccount Firefly III
-

[ Voor 100% gewijzigd door Firefly III op 05-03-2016 15:33 . Reden: Leeg vanwege privacy. ]

Hulp nodig met Firefly III? ➡️ Gitter ➡️ GitHub ➡️ Mastodon


Acties:
  • 0 Henk 'm!

  • Niemand_Anders
  • Registratie: Juli 2006
  • Laatst online: 09-07-2024

Niemand_Anders

Dat was ik niet..

Invisible_man schreef op woensdag 14 oktober 2009 @ 15:43:
Komen deze waardes uit een mySQL database? Zo ja, zou je kunnen beginnen om deze te laten sorteren (ORDER BY) op dat veld zodat je in ieder geval de zelfde waardes onder elkaar hebt. Zodra je dat hebt kan je al veel makkelijker het aantal de zelfde tellen.
Als het uit een database komt kun je beter direct al een group by doen.. hoef je niet meer te tellen. Is nog gemakkelijker.

If it isn't broken, fix it until it is..


Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 17-09 14:05

.oisyn

Moderator Devschuur®

Demotivational Speaker

Slarioux schreef op woensdag 14 oktober 2009 @ 15:58:
[...]

Sorry baas. Zal niet meer gebeuren.
Dat dacht ik. En nu snel weer aan het werk! ;)
bglnelissen schreef op woensdag 14 oktober 2009 @ 15:54:
ik zou zoiets doen:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// initialiseer variabelen
$array_met_keys = '';

foreach ($array as $key => $value){
    // checken of de $value al voorbij is gekomen
    if(! in_array($value, $array_met_keys)){
        // de $value is nog niet voorbij gekomen
        // sla deze op in de nieuwe array met het aantal keer dat de $value voorkomt.

        // zoek alle keys waarvan de value $value is.
        $array_met_keys[$value] = array_keys($array, $value)); 
    }
}

// geef output weer op scherm.
print($array_met_keys);
Ten eerste werkt dit niet*, ten tweede doet dit niet wat de TS wilt, en ten derde is dit O(n2) ipv O(n)
En ten vierde moet je code tags gebruiken

.edit:
*Blijkbaar werkt dit dus wel. Ik doelde op de initialisatie met een lege string op regel 2, maar blijkbaar vindt PHP het dan prima als je het vervolgens als array benadert. Was het geen lege string, dan kan het ineens niet meer.

[ Voor 77% gewijzigd door .oisyn op 14-10-2009 16:29 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • dik_voormekaar
  • Registratie: April 2003
  • Laatst online: 15-09 21:32
Zoiets?
PHP:
1
2
3
4
5
$array = (0, 20, 0, 35, 0, 20);
foreach ($array as $element)
{
$count[$element] ++;
}

Acties:
  • 0 Henk 'm!

  • hostname
  • Registratie: April 2009
  • Laatst online: 17-09 17:56
RobIII schreef op woensdag 14 oktober 2009 @ 15:43:
My God. Heeft PHP dan écht overal een functie voor? :X
Qua array's wel ja.
.oisyn schreef op woensdag 14 oktober 2009 @ 15:53:
Nou ja, 't is op zich geen rare functie. Wat wel weer jammer is is dat men op die manier helemaal niets meer leert :/
Dat ligt imho niet echt aan de hoeveelheid functies de taal je voorschotelt. Ik ken die functie, maar ik snap ook echt wel hoe je zoiets zelf moet implementeren.
Het ligt meer aan de insteek van de programmeur: gaat hij er gewoon op los googlen / vragen op een forum en de antwoorden klakkeloos overnemen, of gaat hij echt nadenken hoe hij het zelf op kan lossen. Bij PHP is alleen zo dat er veel meer van de 1e categorie zijn (in vergelijking met andere talen).
.oisyn schreef op woensdag 14 oktober 2009 @ 16:02: Ik doelde op de initialisatie met een lege string op regel 2, maar blijkbaar vindt PHP het dan prima als je het vervolgens als array benadert. Was het geen lege string, dan kan het ineens niet meer.
Mijn PHP (5.3) vind het niet echt prima, die komt met een warning:
Warning: in_array() expects parameter 2 to be array, string given in /media/data/oxan/public_html/test.php on line 10
Ik mis eerlijk gezegd nog een notice op regel 11, maar dat is ook te verklaren. Je kan in PHP namelijk $string[0] gebruiken om het eerste teken van een string in te lezen. Als je er dan vervolgens een array aan assignt kan/moet/zou hij dan weer wel een warning moeten geven.

[ Voor 26% gewijzigd door hostname op 14-10-2009 17:48 ]


Acties:
  • 0 Henk 'm!

  • hostname
  • Registratie: April 2009
  • Laatst online: 17-09 17:56
// dubbel

[ Voor 98% gewijzigd door hostname op 14-10-2009 17:47 ]


Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 17-09 14:05

.oisyn

Moderator Devschuur®

Demotivational Speaker

hostname schreef op woensdag 14 oktober 2009 @ 17:44:
Dat ligt imho niet echt aan de hoeveelheid functies de taal je voorschotelt. Ik ken die functie, maar ik snap ook echt wel hoe je zoiets zelf moet implementeren.
Het ligt meer aan de insteek van de programmeur: gaat hij er gewoon op los googlen / vragen op een forum en de antwoorden klakkeloos overnemen, of gaat hij echt nadenken hoe hij het zelf op kan lossen. Bij PHP is alleen zo dat er veel meer van de 1e categorie zijn (in vergelijking met andere talen).
Nogmaals, het was geen waarde-oordeel over PHP. Zo'n functie past prima in een standaard library van een taal.
hostname schreef op woensdag 14 oktober 2009 @ 17:44:
Mijn PHP (5.3) vind het niet echt prima, die komt met een warning:
Ah ja, de in_array was ik zelfs nog vergeten.
Ik mis eerlijk gezegd nog een notice op regel 11, maar dat is ook te verklaren. Je kan in PHP namelijk $string\[0] gebruiken om het eerste teken van een string in te lezen. Als je er dan vervolgens een array aan assignt kan/moet/zou hij dan weer wel een warning moeten geven.
Dat is dus waar ik op doelde. Het leuke is, alles is om te zetten naar een string. Dus als jij dit doet:
PHP:
1
2
$str = "test";
$str[0] = array(1, 2, 3);

Dan is $str dus gewoon "Aest". Omdat ie de array naar string converteert (dat wordt "Array"), en daar gebruikt ie het eerste teken van om te assignen aan de char op die positie in de string 8)7. Het stomme is echter, als $str gewoon een lege string was, dan wordt $str wel ineens een array.

[ Voor 32% gewijzigd door .oisyn op 14-10-2009 17:53 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • Icelus
  • Registratie: Januari 2004
  • Niet online
.oisyn schreef op woensdag 14 oktober 2009 @ 17:48:
Dat is dus waar ik op doelde. Het leuke is, alles is om te zetten naar een string. Dus als jij dit doet:
PHP:
1
2
$str = "test";
$str[0] = array(1, 2, 3);

Dan is $str dus gewoon "Aest". Omdat ie de array naar string converteert (dat wordt "Array"), en daar gebruikt ie het eerste teken van om te assignen aan de char op die positie in de string 8)7. Het stomme is echter, als $str gewoon een lege string was, dan wordt $str wel ineens een array.
Klopt, dit is echter wel gedocumenteerd.

Volgende levert bijvoorbeeld 1est op:
PHP:
1
2
$str = "test";
$str[0] = true;

Terwijl een false ' est' oplevert.

Developer Accused Of Unreadable Code Refuses To Comment


Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 17-09 14:05

.oisyn

Moderator Devschuur®

Demotivational Speaker

En wat is dan het verschil tussen een lege string en een niet-lege string? :)

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • Cartman!
  • Registratie: April 2000
  • Niet online
Als PHP-er kan ik me ook enorm verbazen over zulke grappen maar als je weet hoe je ermee om moet gaan dan is t niet echt een probleem imo.

Uit logica-oogpunt zou ik in het stukje code van hierboven dan ook de lege array definen als
PHP:
1
$array_met_keys = array();

Acties:
  • 0 Henk 'm!

Verwijderd

.oisyn schreef op woensdag 14 oktober 2009 @ 17:55:
En wat is dan het verschil tussen een lege string en een niet-lege string? :)
*snip*

[ Voor 15% gewijzigd door een moderator op 15-10-2009 22:06 . Reden: Je zal dit topic maar op je werk bekijken.. Ja, sommige mensen mogen GoTten op werk ;) ]


Acties:
  • 0 Henk 'm!

  • Zoijar
  • Registratie: September 2001
  • Niet online

Zoijar

Because he doesn't row...

Toch vraag ik me een beetje af of een hash echt sneller is dan een sort in de praktijk. Cache performance van een hash tabel is vrij slecht (en van een merge sort vrij goed), plus dat je nog moet rehashen en te maken hebt met hash collisions (insertions/lookups zijn overigens slechts amortized O(1)). Als je je hash tabel naief steeds 2x zo groot maakt bij het rehashen, dan moet je log n keer rehashen en loopt je algoritme in ongeveer O(nlogn), net als bij een sort. Dus je moet van te voren ruimte reserveren. Zou wel grappig zijn om eens te tesen. Ik verwacht wel dat hashing het wint, maar echt zeker ben ik niet.

Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 17-09 14:05

.oisyn

Moderator Devschuur®

Demotivational Speaker

Anders doe je dat even achter een linkje, in een serieus topic wat ook op het werk wordt gelezen :)

[ Voor 10% gewijzigd door .oisyn op 15-10-2009 21:37 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • Shuvit
  • Registratie: Maart 2000
  • Laatst online: 11-06-2024
RobIII schreef op woensdag 14 oktober 2009 @ 15:43:
[...]

My God. Heeft PHP dan écht overal een functie voor? :X What happened to zelf schrijven? :+
Je moet het iets anders zien, met PHP hoef je niet telkens het wiel opnieuw uit te vinden. Scheelt iig tijd :+

void


Acties:
  • 0 Henk 'm!

  • CodeCaster
  • Registratie: Juni 2003
  • Niet online

CodeCaster

Can I get uhm...

Shuvit schreef op vrijdag 16 oktober 2009 @ 10:09:
[...]


Je moet het iets anders zien, met PHP hoef je niet telkens het wiel opnieuw uit te vinden. Scheelt iig tijd :+
Nee, je bent alleen maar in de handleiding aan het zoeken hoe een functie om een alledaagse taak uit te voeren heet en wat de argumenten zijn, in plaats van dat je het in drie regels zelf schrijft.

[ Voor 4% gewijzigd door CodeCaster op 16-10-2009 10:12 ]

https://oneerlijkewoz.nl
Op papier is hij aan het tekenen, maar in de praktijk...


Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 17-09 14:05

.oisyn

Moderator Devschuur®

Demotivational Speaker

Shuvit schreef op vrijdag 16 oktober 2009 @ 10:09:
[...]


Je moet het iets anders zien, met PHP hoef je niet telkens het wiel opnieuw uit te vinden. Scheelt iig tijd :+
't Is alleen jammer dat PHP's wielen altijd polygonaal zijn ipv rond. 't Werkt wel, je hebt alleen veel vertices nodig :Y)

[ Voor 7% gewijzigd door .oisyn op 16-10-2009 10:31 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.

Pagina: 1