Sorteren van opgevraagde code uit database.

Pagina: 1
Acties:

Vraag


Acties:
  • 0 Henk 'm!

  • Xanquezer
  • Registratie: Maart 2009
  • Laatst online: 16-05 09:05
Mijn vraag:

Hoe kan ik een "custom" field, die uit de database komt, sorteren (zoals <tb> 1 </tb> <tb> 2 </tb> etc...)


Relevante software en hardware die ik gebruik:

Een stukje code voor het generen van de tabel wat ik gebruik is:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
<?php
if ($this->displayCustomField)
{
    foreach($this->fields as $fieldId)
    {
        $cols++;
    ?>
        <th class="veld<?php echo $fieldId; ?>colom">
            <?php echo $this->fieldTitles[$fieldId] ;  ?>
        </th>
    <?php
    }
}



Wat ik al gevonden of geprobeerd heb

Ergens moest ik een "order by: asc" of zo iets bij zetten, alleen als ik dat doe (ook met DIR=asc) krijg ik helaas toch n fout.
Momenteel word het gesorteerd op n random ID in de achtergrond... maar deze kan ik niet wijzigen ivm andere relatie`s/functies.

Heeft toevallig iemand n suggestie?

*note: applicatie is gedeelte zelf ontwikkeld en gedeelte geschreven door n 3de partij die behoorlijk omslachtig is.

[ Voor 3% gewijzigd door RobIII op 31-10-2022 16:49 . Reden: Syntax highlighting en indenting ]

DPC Chef-kok :)

Beste antwoord (via Xanquezer op 02-11-2022 21:22)


  • Dido
  • Registratie: Maart 2002
  • Laatst online: 19:12

Dido

heforshe

Xanquezer schreef op dinsdag 1 november 2022 @ 18:30:
Klopt.
De database is gesorteerd op n ander ID / data / gegevens (net hoe je t ziet)
Vanuit een tabel haal ik data op en vanuit aantal andere tabellen haal ik data op (database is nogal groot/verspreid...)

Na opvragen van de query/tabel wil ik ze nogmaals sorteren op n ander veld (displayCustomField).
"displayCustomField" bevat alleen getallen (1 t/m 99), deze staan nu lekker door elkaar :9
Dat sorteren moet je waarschijnlijk doen tijdens het ophalen van de data, maar ik zie nergens staan hoe je die data ophaalt ;)

Wat betekent mijn avatar?

Alle reacties


Acties:
  • +1 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Laatst online: 08:46

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

Er is hier nergens een query te bekennen dus "ergens een order by asc" zetten is er (hier) niet bij. Dus of je zult je query moeten tonen of je zult je $this->fields moeten sorteren met sort of usort ofzo.

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:
  • +1 Henk 'm!

  • switchboy
  • Registratie: September 2002
  • Laatst online: 18-05 13:59

switchboy

-ruimte te huur-

Het is vaak sneller om te zorgen dat je data al in de volgorde of met de structuur die je wilt PHP binnenkomt,
code:
1
SELECT * FROM tabel ORDER BY id ASC

code:
1
SELECT * FROM tabel ORDER BY id DESC


Dan kan je ze bij de ingestie op volgorde in je array met objecten zetten met array_push(). Het object wat in de eerste rij uit je database query resultaten komt rollen zal dan op plek 0 staan in je array met objecten. Dan dan hoeft je dus niiet achteraf te sorteren

maar als je daar geen controle over hebt kan je het zo oplossen:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<?php
if ($this->displayCustomField)
{
    usort($this->fields, function ($first, $second) {
        return ($first <=> $second);
    }); //Dit is een lijst van laag naar hoog

    usort($this->fields, function ($first, $second) {
        return ($first <=> $second) * -1;
    }); //Dit is een lijst van hoog naar laag

   
    foreach($this->fields as $fieldId)
    {
        $cols++;
        echo "<th class=\"veld".$fieldId."colom\">".$this->fieldTitles[$fieldId]."</th>"; 
/*
functioneel hetzelfde als in en uit php springen, maar veel leesbaarder IMHO
*/
    }
}

?>


Edit: Bedenk met wel dat de fieldId bij jouw functie blijkbaar de id van de positie van de titel is in een andere array representeerd; als ik die id's op volgorde zet zullen de titels in de andere array nog steeds in de oude volgorde staan. Maw als ik nu $this->fieldTitles[0] opvraag krijg ik waarschijnlijk nog steeds de titel die op de eerste rij bij ingestie stond :P

Als die lijst statisch is of ergens anders vandaan komt kan dat het gewenste gedrag zijn. Maar als die id en titel uit dezelfde database komen en gekoppeld zijn dan denk ik niet dat je dit gedrag wenst :+


Waarom heb je daar losse arrays van gemaakt? Hoe ziet je hele class eruit?


Is dat zo:
code:
1
2
3
4
5
6
7
class voorbeebeeld {
    private $arrayOfFieldIds;
    private $arrayOfTitles;

    //Alle functies van de class

}


of zo:

code:
1
2
3
4
5
6
7
class voorbeebeeld {
    private $fieldId;
    private $title;

    //Alle  functies van de class

}

Het tweede lijkt me een handigere manier om het een en ander te benaderen. Hierbij blijft je database id altijd aan de rest van de data gekoppelt ;)

In het tweede geval moet je namelijk de array waar je objecten van deze class inzitten sorteren. Adh $object->fieldId :P (als in een array $arrayMetObjecten[positieinArray]->fliedId )

like so
code:
1
2
3
usort($arrayOfObjects, function ($first, $second) {
        return ($first->fieldId <=> $second->fieldId); //NB fliedId moet hiervoor public zijn of je moet een getter maken
    });


of fancy met een sort functie in de class zelf

[ Voor 60% gewijzigd door switchboy op 01-11-2022 01:37 ]

My Steam Profile (Name Switch) Worth: 889€ (225€ with sales)Games owned: 83


Acties:
  • 0 Henk 'm!

  • Xanquezer
  • Registratie: Maart 2009
  • Laatst online: 16-05 09:05
Switchboy,
Bedankt voor je antwoord, so close dat het goed staat.

Ik heb trouwens nog n stukje extra code die de tabel "vult"

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
                <?php
                }

                if ($this->displayCustomField)
                {
                    
                    foreach($this->fields as $fieldId)
                    {
                        if (isset($this->fieldValues[$row->id][$fieldId]))
                        {
                            $fieldValue = $this->fieldValues[$row->id][$fieldId];
                        }
                        else
                        {
                            $fieldValue = '';
                        }
                    ?>

<td class="tdno<?php echo $i; ?>" data-content="<?php echo $this->fieldTitles[$fieldId]; ?>">
                            <?php echo $fieldValue ?>
                        </td>

Ik denk dat het stukje:
code:
1
$fieldValue = $this->fieldValues[$row->id][$fieldId];

een sort kan gebruiken om het op orde te krijgen.
Al vraag ik me heel even af of de andere "rows" niet aangetast worden (niet dat de rijen verkeerd komen te staan)

[ Voor 9% gewijzigd door Xanquezer op 01-11-2022 18:10 ]

DPC Chef-kok :)


Acties:
  • 0 Henk 'm!

  • Dido
  • Registratie: Maart 2002
  • Laatst online: 19:12

Dido

heforshe

Je hebt het over sorteren, maar geeft vervolgens aan hoe je je tabel "geneert" en "vult".

Je wilt je gegevens niet "gesorteerd" in je database hebben, je wilt ze sorteren bij het lezen.
De volgorde waarin ze in je tabel staan mag niet relevant zijn.

Wat betekent mijn avatar?


Acties:
  • 0 Henk 'm!

  • Xanquezer
  • Registratie: Maart 2009
  • Laatst online: 16-05 09:05
Dido schreef op dinsdag 1 november 2022 @ 18:19:
Je hebt het over sorteren, maar geeft vervolgens aan hoe je je tabel "geneert" en "vult".

Je wilt je gegevens niet "gesorteerd" in je database hebben, je wilt ze sorteren bij het lezen.
De volgorde waarin ze in je tabel staan mag niet relevant zijn.
Klopt.
De database is gesorteerd op n ander ID / data / gegevens (net hoe je t ziet)
Vanuit een tabel haal ik data op en vanuit aantal andere tabellen haal ik data op (database is nogal groot/verspreid...)

Na opvragen van de query/tabel wil ik ze nogmaals sorteren op n ander veld (displayCustomField).
"displayCustomField" bevat alleen getallen (1 t/m 99), deze staan nu lekker door elkaar :9

DPC Chef-kok :)


Acties:
  • Beste antwoord
  • +2 Henk 'm!

  • Dido
  • Registratie: Maart 2002
  • Laatst online: 19:12

Dido

heforshe

Xanquezer schreef op dinsdag 1 november 2022 @ 18:30:
Klopt.
De database is gesorteerd op n ander ID / data / gegevens (net hoe je t ziet)
Vanuit een tabel haal ik data op en vanuit aantal andere tabellen haal ik data op (database is nogal groot/verspreid...)

Na opvragen van de query/tabel wil ik ze nogmaals sorteren op n ander veld (displayCustomField).
"displayCustomField" bevat alleen getallen (1 t/m 99), deze staan nu lekker door elkaar :9
Dat sorteren moet je waarschijnlijk doen tijdens het ophalen van de data, maar ik zie nergens staan hoe je die data ophaalt ;)

Wat betekent mijn avatar?


Acties:
  • 0 Henk 'm!

  • Xanquezer
  • Registratie: Maart 2009
  • Laatst online: 16-05 09:05
Dido schreef op dinsdag 1 november 2022 @ 18:37:
[...]

Dat sorteren moet je waarschijnlijk doen tijdens het ophalen van de data, maar ik zie nergens staan hoe je die data ophaalt ;)
Opgelost door idd sort te gebruiken bij het ophalen van data (stuk terug in de code...).

DPC Chef-kok :)


Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Laatst online: 08:46

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

Xanquezer schreef op dinsdag 1 november 2022 @ 18:30:
De database is gesorteerd op n ander ID / data / gegevens (net hoe je t ziet)
Nee, de "database" is "gesorteerd" op de (hoogstwaarschijnlijk primary) key die hoogst-hóógstwaarschijnlijk 'gesorteerd' is omdat 't een clustered index is ;)

In principe ga je er bij een DB altijd van uit dat -in essentie- je data ongesorteerd is; bij het ophalen geef je dan aan hoe je de zooi gesorteerd wil hebben. Doe je dat niet, dan krijg je waarschijnlijk de data terug in volgorde waarop SQL 't op disk tegen komt - en dat is dus in volgorde van de clustered index. Maar ik zeg hier waarschijnlijk omdat er geen garanties zijn dat 't altijd zo is noch altijd zo zal blijven; dus tenzij de sortering je écht zal roesten moet je, in principe, altijd een order by clause in je query hebben.

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

Pagina: 1