[php] array duplicates eruit gooien en sorteren

Pagina: 1
Acties:

Onderwerpen


  • Zillion01
  • Registratie: Juni 2001
  • Laatst online: 20-09 19:14

Zillion01

Obey your screen!

Topicstarter
Hoi

Ik heb een variabele $data met de volgende inhoud :

code:
1
2.1,1.1,4.3,2.2,3.1,1.0,2.1,3.0,2.1,3.1,2.0,1.1,4.0,


Nu is het getal voor de . een id die maar 1 keer mag voor komen. Het getal erachter is de value van die id.

De laatst toegevoegde combi's van id+value moeten over blijven. Deze moeten zowel in een array als terug in de variabele, gesorteerd op id van laag naar hoog.

Dus in dit geval zou de array moeten worden
code:
1
2
3
4
[1][1]
[2][0]
[3][1]
[4][0]


Ik heb al aardig lopen zoeken, maar de meeste oplossingen betreffen het overhouden van een unieke combi. Zoals de meest eenvoudige met de array_unique() functie. Iemand?

  • roy-t
  • Registratie: Oktober 2004
  • Laatst online: 19-09 10:19
1. Mag dit ook?
code:
1
2
3
4
5
[1][1]
[1][2]
[1][3]
[2][1]
...


2. Wat heb je zelf al geprobeerd (behalve arr_unique)? Het is de bedoeling dat je wat inzet toent

3. Omdat dit probleem redelijk triviaal lijkt, wat vind je van de gedachten gang van een oplossing als dit:


Eerst de array splitten op "," dan krijg je een array van elementen die er zo uit zien "#.#' (waar # een digit is). Voor elk van deze elementen doe je weer split maar dan op ".". Nu heb je een array {#, #}, laten we die even arrVersion noemen. In je output array (arrOutput) doe je dan iets als:
code:
1
arrOutput[arrVersion[0]][arrVersion[1]];


4. Ik weet niet of dit precies is wat je wilt, maar zet volgende keer de stappen die je als mens nodig hebt even op papier, dan kun je die aantekeningen zelf 1 voor 1 omzetten naar code, dan heb je ons niet nodig voor zoiets specifieks en simpels.

[ Voor 17% gewijzigd door roy-t op 26-08-2010 20:08 ]

~ Mijn prog blog!


  • Zillion01
  • Registratie: Juni 2001
  • Laatst online: 20-09 19:14

Zillion01

Obey your screen!

Topicstarter
Ja sorry hoor ben maar een beginner.

In jouw lijstje staan nog duplicate id's

Ik zou denken iets van

1. Explode naar een array
2. Count de array
2. Voeg een kolom tellertje toe desc
3. check of een id nog eens voorkomt vanaf asc
4. zet daar een vinkje achter in een nieuwe array
5. delete in de array waar vinkje achter staat
6. delete de kolommen tellertje en vinkje

Goed ga ik dat wel uitvogelen, maar leek me nogal omslachtig...

[ Voor 5% gewijzigd door Zillion01 op 26-08-2010 20:20 ]


  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 02:21

Janoz

Moderator Devschuur®

!litemod

Ten eerste: Dit is geen topic voor in SE&A. Het is gewoon een programmeer probleem.

Ten tweede: Programmeren is meer dan op zoek naar de standaardfunctie die precies doet wat je wilt. Programmeren is algoritmes verzinnen die doen wat je wilt. Zo heel omslachtig is die tweede poging dus niet. Er zijn echter wel een aantal overbodige stapjes.

Array counten is niet nodig en ook het vooruitzoeken is niet nodig. Wanneer je een manier hebt gevonden waarbij je de vorige gewoon overschrijft hou je immers automatisch de laatste over. Je zou het jezelf nog makkelijker maken wanneer je de id als key zou nemen in de array ipv een 2d array te maken. (En als de 2d array een harde eis is dan is het misschien wel makkelijker om de key->value pairs aan het eind nog eens om te zetten naar een 2d array)

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Wat is er lastig aan het door een array heen lopen en in een tweede array je resultaten bij te houden per value?

Verder: Waar hoort mijn topic?

SEA>>PRG

edit:
Janoz is te snel. :P

[ Voor 8% gewijzigd door NMe op 26-08-2010 20:36 ]

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • orf
  • Registratie: Augustus 2005
  • Laatst online: 17:05

orf

Als je het getal links van de punt gebruikt als array key, dan hoef je niet te ontdubbelen omdat de key dan vanzelf overschreven wordt. Vervolgens hoef je alleen maar te sorteren op key (ksort) om de juiste array eruit te krijgen.


PHP:
1
2
3
4
5
6
7
8
9
10
$input = '2.1,1.1,4.3,2.2,3.1,1.0,2.1,3.0,2.1,3.1,2.0,1.1,4.0';
$arrInput = explode(',', $input);

$result = array();
foreach($arrInput as $nr){
    $expl = explode('.', $nr);
    $result[$expl[0]] = $expl[1];   
}
ksort($result);
echo '<pre>' . $input . '<hr>' . print_r($result, true);


Edit: 3 replies in dezelfde minuut. Volgens mij heeft Janoz dezelfde denkwijze. :)

[ Voor 8% gewijzigd door orf op 26-08-2010 20:33 ]


  • Zillion01
  • Registratie: Juni 2001
  • Laatst online: 20-09 19:14

Zillion01

Obey your screen!

Topicstarter
orf schreef op donderdag 26 augustus 2010 @ 20:32:
Als je het getal links van de punt gebruikt als array key, dan hoef je niet te ontdubbelen omdat de key dan vanzelf overschreven wordt. Vervolgens hoef je alleen maar te sorteren op key (ksort) om de juiste array eruit te krijgen.
thx a lot, moest het wel even heel goed bestuderen, maar ik snap het geloof ik. :)

  • SoulWar1
  • Registratie: Augustus 2004
  • Laatst online: 18-09 22:27
Een ksort hoeft niet lijkt me, aangezien de getallen al geïndexeerd zijn. De string kun je vervolgens opnieuw genereren met je result array.

PHP:
1
2
3
4
$data = '';
foreach($result as $key => $value) {
     $data .= "{$key}.{$value},";
}

Know Thyself


  • Zillion01
  • Registratie: Juni 2001
  • Laatst online: 20-09 19:14

Zillion01

Obey your screen!

Topicstarter
SoulWar1 schreef op donderdag 26 augustus 2010 @ 20:51:
Een ksort hoeft niet lijkt me, aangezien de getallen al geïndexeerd zijn. De string kun je vervolgens opnieuw genereren met je result array.

PHP:
1
2
3
4
$data = '';
foreach($result as $key => $value) {
     $data .= "{$key}.{$value},";
}
Zonder ksort gaat de volgorde niet goed. En fijn dit stukje code was ik net aan het uitzoeken.

  • Voutloos
  • Registratie: Januari 2002
  • Niet online
Dat je de oplossing voor het maken van de array op een presenteerblaadje krijgt gaat al vrij ver, maar hoe er weer een string van te maken was dan nog een beetje een oefeningetje geweest.

We zitten hier (hopelijk) toch echt niet op wijkauwenalleswelvoorjevoor.net ...

{signature}


  • roy-t
  • Registratie: Oktober 2004
  • Laatst online: 19-09 10:19
Zillion01 schreef op donderdag 26 augustus 2010 @ 20:19:
Ja sorry hoor ben maar een beginner.
Exact, dus daarom leg ik je het even vriendelijk uit en heeft de mod je topic nog niet gesloten :), als ik je er niet op aan had gesproken, hoe weet je het dan de volgende keer? :).
In jouw lijstje staan nog duplicate id's
Misschien kun je nog even toelichten hoe een id duplicate is, vooral omdat het uiteindelijk voorgekauwde voorbeeld ongeveer de code was die bij mijn verhaaltje zou horen, behalve dan de ksort, maar dat is een sorteer algoritme en verwijderd dus niets :). toch? Mijn php is een beetje roestig

[ Voor 3% gewijzigd door roy-t op 26-08-2010 21:36 ]

~ Mijn prog blog!


  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Hoe krijg je de data trouwens om te beginnen al in die vorm? Waar komt die vandaan? En waarom wil je het na filteren weer terug in die vorm hebben? Het gaat niet een database in hoop ik?

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Give a man a fish and feed him for a day. Teach a man how to fish and feed him for a lifetime.
;)
NMe schreef op donderdag 26 augustus 2010 @ 22:08:
Het gaat niet een database in hoop ik?
Iets met assumptions en fuckups enzo ;) Met de informatie die we nu hebben kan het god-knows-what zijn en of dat dan een DB in gaat of naar /dev/null of whatever is niet relevant ;)

[ Voor 5% gewijzigd door RobIII op 26-08-2010 22:39 ]

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


  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

RobIII schreef op donderdag 26 augustus 2010 @ 22:38:
[...]

Iets met assumptions en fuckups enzo ;) Met de informatie die we nu hebben kan het god-knows-what zijn en of dat dan een DB in gaat of naar /dev/null of whatever is niet relevant ;)
Vandaar ook dat ik het navraag. ;) Nu het directe probleem opgelost is hebben we alle tijd om een eventueel onderliggend probleem ook op te lossen. :P

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • Zillion01
  • Registratie: Juni 2001
  • Laatst online: 20-09 19:14

Zillion01

Obey your screen!

Topicstarter
Het is voor een nieuwe plugin van TYPO3, na het aantal keer invullen van een form (met radiobuttons die ik escape met intval) dient telkens een session aangevuld / bewaard te blijven in een function writeSessionData ($data).

Ik besefte echter niet dat je ook gewoon een array in een sessie kunt duwen ipv een variabele, dus uiteindelijk heb ik het nu weer omgebouwd, maar gebruik nog wel fijn de ksort, wist niet dat ie bestond.

PHP:
1
2
3
4
5
6
7
8
 if (!empty($OldSessionData)) {
            $newData = $data + $OldSessionData; //append array elements from the second array to the first array while not overwriting the elements from the first array 
        else {
            $newData = $data;
        }
        ksort($newData); // sort array on key
        $session[$extKey] =  $newData;
        $TSFE->fe_user->setKey('ses','tx_jptest_pi1',$session);

etc.

De session array kan ik dan later weer fijn uitlezen om te kijken wat er ingevuld is.

Bedankt, ik heb ff geen PHP hulp meer nodig nu ;-)

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Als je nog eens iets in een session op wil slaan dat er niet zomaar in kan (arrays van objecten, of gewoon objecten in het algemeen), kijk dan eens naar de serialize-functie. :)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • FragFrog
  • Registratie: September 2001
  • Laatst online: 09:34
NMe schreef op vrijdag 27 augustus 2010 @ 16:10:
Als je nog eens iets in een session op wil slaan dat er niet zomaar in kan (arrays van objecten, of gewoon objecten in het algemeen), kijk dan eens naar de serialize-functie. :)
Arrays van objecten en objecten kun je ook zonder (handmatige) serialize prima in de sessie opslaan ;)

Overigens is het doorgaans slim om arraywaardes niet direct in je sessie te zetten - wat nu als je later op een andere plek ook dergelijke data in je sessie wilt opslaan? Sessies zijn globaal en persistent, dus dan heb je er vrij snel last van. Al lijkt het in dit geval niet aan de orde, ik heb nagenoeg geen ervaring met latere typo3 versies maar zo te zien gooi je alsnog gewoon een variabele erin :)

[ Site ] [ twitch ] [ jijbuis ]


Acties:
  • 0 Henk 'm!

  • Zillion01
  • Registratie: Juni 2001
  • Laatst online: 20-09 19:14

Zillion01

Obey your screen!

Topicstarter
FragFrog schreef op vrijdag 27 augustus 2010 @ 17:42:
[...]

Overigens is het doorgaans slim om arraywaardes niet direct in je sessie te zetten - wat nu als je later op een andere plek ook dergelijke data in je sessie wilt opslaan? Sessies zijn globaal en persistent, dus dan heb je er vrij snel last van. Al lijkt het in dit geval niet aan de orde, ik heb nagenoeg geen ervaring met latere typo3 versies maar zo te zien gooi je alsnog gewoon een variabele erin :)
Uuh hoe zou je het dan oplossen? Ik snap niet wat je bedoelt. En het is overigens TYPO3 ;) niet typo3. De session functie is al eeuwen niet veranderd volgens mij. De data die in de sessie wordt gestored kan ik gewoon uitlezen als een array ;)
Pagina: 1