[PHP] Sorteren arrays op waarde per array lukt niet

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • unitzero
  • Registratie: Oktober 2001
  • Laatst online: 11-07 07:31
Ik weet het even niet meer.

Ik heb hier een tekstbestand:

code:
1
2
dag*maand*jaar*tekst van activiteit\n
dag*maand*jaar*tekst van activiteit\n

etc... en dat kan onbeperkt doorgaan.

Nu moet hier, op de juiste plek, aangezien de datum oploopt (het is voor een online agenda) een nieuwe activiteit toegvoegd kunnen worden. Ik heb nu het bestand opgesplitst door op \n te exploden. Vervolgens wordt in een loopje vergeleken of de dag, maand en jaar al groter zijn dan wat er in die regel staat door ook de regel te exploden op *. Heeft ie de plek gevonden, dan moet ik dus zo'n hele regel midden in een array toe kunnen voegen. En dat lukt nu dus niet meer, ik heb even helemaal geen aanknopingspunt meer. Ik kon geen array-functie vinden die dit vor mij kon doen, en ook combinatie van meerdere functies leverde niks op.
Ik heb geprobeerd de array te chunken op de aangeleverde lengte, achteraan de nieuwe array-entry toe te voegen en vervolgens alles weer samen te plakken, dat werkt niet, aangezien er niet bijgehouden wordt in hoeveel plakjes de array gechunkt is. Gaat daar al iets fout, of pak ik dat helemaal verkeerd aan?

Een andere optie is het achteraan plaatsen van de regel, en dan bij het uitlezen te sorteren, maar alle array-sort functies sorteren alleen binnen een array zelf, of heb ik dat verkeerd gezien. Ik ben niet zo'n held in PHP en nu zit ik dus even vast...

Acties:
  • 0 Henk 'm!

  • Banpei
  • Registratie: Juli 2001
  • Laatst online: 25-10-2022

Banpei

Hachiroku on this touge?

/me Denkt dat de multisort jouw probleem oplost. ;)

[ Voor 5% gewijzigd door Banpei op 17-06-2003 10:53 ]

AE86 gevonden! | So what I thought I'd do was, I'd pretend to be one of those deaf-mutes.


Acties:
  • 0 Henk 'm!

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

De simpele oplossing:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$oldarray = ...;
$newarray = array();
$newentry = ...;
$entryadded = false;
foreach($oldarray as $val)
{
   if(!$entryadded && $val > $newentry)
   {
      $newarray[] = $newentry
      $entryadded = true;
   }

   $newarray[] = $val;
}
$oldarray = $newarray;

Uiteraard eerst controleren of je snapt wat het zou moeten doen en dan controleren of het dan ook daadwerkelijk doet en of dat is wat je wil. Ik klop dit ongetest in.

[ Voor 5% gewijzigd door ACM op 17-06-2003 11:05 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Misschien dat dit een iets betere opzet is :

PHP:
1
2
3
4
5
    $ActArray[mktime(0, 0, 0, 6, 15, 2003)][] = "sheeponfire is jarig";
    $ActArray[mktime(0, 0, 0, 6, 15, 2003)][] = "sheeponfire viert zijn verjaardag";
    $ActArray[mktime(0, 0, 0, 6, 16, 2003)][] = "sheeponfire heeft een kater";
    
    print_r($ActArray);


Je kan de data dan gewoon opslaan in een text file als:

code:
1
2
3
329868000;sheeponfire is jarig
329868000;sheeponfire viert zijn verjaardag
329954400;sheeponfire heeft een kater


De volgorde maakt niet uit! Die dat kan je dan zo weer uitlezen

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
27
28
29
30
31
    $ActArray = array();

    $FilePointer = fopen("act.txt", "r");

    while($Data = fgetcsv($FilePointer, 1000, ";"))
    {
        //vul de array $ActArray met de data
        //gebruik de timestamp als key
        //per timestamp kunnen er meerdere activiteiten zijn
        $ActArray[$Data[0]][] = $Data[1];
    }

    fclose($FilePointer);

    //sorteer met asort om index te behouden
    //geef parameter SORT_NUMERIC mee om numeriek te sorteren 
    asort($ActArray, SORT_NUMERIC);

    // loop door $ActArray en print de data
    foreach($ActArray as $Datum => $Activiteiten)
    {
        echo date("j-m-Y", $Datum) . ":<br />";

        foreach($Activiteiten as $Activiteit)
        {
            echo $Activiteit . "<br />";
        }

        echo "<p />";

    }

[ Voor 15% gewijzigd door Verwijderd op 17-06-2003 11:32 . Reden: oops iets te laat, maar deze code is met garantie :), ]


Acties:
  • 0 Henk 'm!

  • unitzero
  • Registratie: Oktober 2001
  • Laatst online: 11-07 07:31
Okee, ik ga het eens doorkijken, kijken of ik het begrijp wat hier gebeurt. Ik moest me maar eens beter in arrays gaan verdiepen... :)

Acties:
  • 0 Henk 'm!

  • unitzero
  • Registratie: Oktober 2001
  • Laatst online: 11-07 07:31
ik ben er even mee bezig geweest, maar kom er nog niet helemaal uit. Ik heb het nu zo dat ik een array heb met als key inderdaad de timestamps, en met als waarde van de key de tekst die bij de activiteit hoort. als ik dan die array ga sorten met asort, zoals hierboven gebeurt, dan sorteert ie hem toch op de values en niet op de keys zelf? en dan klopt het dus niet meer... of heb ik het nog niet helemaal begrepen...

edit: asort werkt niet, logischerwijs, ksort wel. maar waarom gebruik jij dan asort in je scriptje, sheeponfire?

[ Voor 13% gewijzigd door unitzero op 21-06-2003 22:55 ]


Acties:
  • 0 Henk 'm!

  • Willem2
  • Registratie: Oktober 2000
  • Laatst online: 05-09 07:32

Willem2

Ω is futile

la maar, niet goed gelezen! :)

[ Voor 77% gewijzigd door Willem2 op 22-06-2003 00:47 ]

en nee, ik houd niet van voetbal... :)


Acties:
  • 0 Henk 'm!

  • beetle71
  • Registratie: Februari 2003
  • Laatst online: 09-09 15:24
Om een array te kunnen sorteren op waarden in een subarray zie mijn post in dit topic

Je zult de funtie intcompare dan moeten vervangen door een functie die een compare tussen twee datums doet.
(is ook in die post uitgelegd.)
Pagina: 1