[PHP] Array sorteren

Pagina: 1
Acties:

  • devhouse
  • Registratie: Juli 2008
  • Laatst online: 01-12-2021
Hallo allemaal!

Ik ben een manier aan het zoeken om de volgende array te kunnen sorteren:

Array(
0=>array('order'=>2, 'service'=>true),
1=>array('order'=>1, 'service'=>true),
2=>array('order'=>3, 'service'=>true)
)

deze array dient op het kolom order te worden gesorteerd. Dus uit de bovenstaande array dient het volgende te komen:

Array(
1=>array('order'=>1, 'service'=>true),
0=>array('order'=>2, 'service'=>true),
2=>array('order'=>3, 'service'=>true)
)

Nu heb ik alvast naar de standaard array sort functies van php gekeken, maar ik heb helaas niks gevonden wat zo'n array kan sorteren. Weet iemand misschien een manier om dit te doen?

  • RaZ
  • Registratie: November 2000
  • Niet online

RaZ

Funky Cold Medina

Ey!! Macarena \o/


Verwijderd

Je moet de order als key nemen, en de key in de array zelf zetten. Daarna kan je op key sorteren.

Je kan ook de eerste reactie op php.net nemen.

[ Voor 20% gewijzigd door Verwijderd op 19-09-2009 09:57 ]


  • devhouse
  • Registratie: Juli 2008
  • Laatst online: 01-12-2021
Helaas, ik heb het geprobeerd, maar het wil helaas niet werken. Ik heb nu de volgende array:
code:
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
Array
(
    [0] => Array
        (
            [picture] => 
            [id] => 2
            [reg_date] => 2009-09-02 17:18:29
            [contract] => 80.5
            [name] => Test Account
            [type] => admin
            [password] => ****
            [username] => t.test
            [email] => test@test.ext
        )

    [1] => Array
        (
            [picture] => 
            [contract] => 128.5
            [id] => 1
            [reg_date] => 2009-08-29 11:06:46
            [name] => ****
            [type] => admin
            [password] => ****
            [username] => t.k
            [email] => ****@gmail.com
        )

)


Ik wil hem nu op 'contract' sorteren, en daarvoor heb ik nu de volgende code:
code:
1
sksort($staff, 'contract', false, true);


OF:

code:
1
sksort($staff, 'contract', true, true);


Ik zie geen verschil in de array tussen beide codes, terwijl dat wel hoort.

de functie die ik gebruik ziet er als volgt uit:
code:
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
function sksort(&$array, $subkey="id", $sort_descending=false, $keep_keys_in_sub = false) {
    $temp_array = $array;

    foreach ($temp_array as $key => &$value) {
     
      $sort = array();
      foreach ($value as $index => $val) {
          $sort[$index] = $val[$subkey];
      }
     
      asort($sort);
     
      $keys = array_keys($sort);
      $newValue = array();
      foreach ($keys as $index) {
        if($keep_keys_in_sub)
            $newValue[$index] = $value[$index];
          else
            $newValue[] = $value[$index];
      }
     
      if($sort_descending)
        $value = array_reverse($newValue, $keep_keys_in_sub);
      else
        $value = $newValue;
    }
   
    $array = $temp_array;
    return $array;
  }

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 16-09 09:15

Janoz

Moderator Devschuur®

!litemod

Kijk eens even naar usort

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


Verwijderd

Ik denk dat het ook wel interessant is om te weten waar die array vandaan komt. Het ziet er aardig uit als een resultset van een database query.

  • HuHu
  • Registratie: Maart 2005
  • Niet online
Hij moet naar uasort kijken zo te zien, want hij wil de associatie met de originele index behouden:
tom.keim schreef op zaterdag 19 september 2009 @ 09:52:

Array(
0=>array('order'=>2, 'service'=>true),
1=>array('order'=>1, 'service'=>true),
2=>array('order'=>3, 'service'=>true)
)

deze array dient op het kolom order te worden gesorteerd. Dus uit de bovenstaande array dient het volgende te komen:

Array(
1=>array('order'=>1, 'service'=>true),
0=>array('order'=>2, 'service'=>true),
2=>array('order'=>3, 'service'=>true)
)

  • devhouse
  • Registratie: Juli 2008
  • Laatst online: 01-12-2021
Verwijderd schreef op zaterdag 19 september 2009 @ 10:17:
Ik denk dat het ook wel interessant is om te weten waar die array vandaan komt. Het ziet er aardig uit als een resultset van een database query.
dat is het ook, alleen contract komt uit een andere database, ik zal even uitleggen hoe het werkt.

In de tabel staff staat de user informatie, Dit is de array hieboven, maar dan zonder 'contract'.

Er is ook een tabel 'contracts' hier staat het aantal contract uren, maar omdat ik ook wil weten welke contracten ze allemaal hebben gehad, ziet de tabel er zo uit:
id | user_id | since | until | contract

Het spreekt eigelijk voor zich, since is de start tijd van het contract en until is de eintijd. Wanneer until 0000-00-00 is, is het oneindig(het stopt nooit/nu)

Zo kan het er dus uitzien.
1 | 10 | 2007-09-01 | 2008-08-01 | 12
2 | 10 | 2008-08-01 | 2010-08-01 | 120 <!-- dit is NU
3 | 10 | 2010-08-01 | 0000-00-00 | 20

Ik kon me niet bedenken hoe je hiervan een query kan samenvoegen met die andere, en het dan om het contract uren kan sorteren. Daarom wou ik het op die andere manier doen, maar die lukt dus ook niet :(

  • rhodium
  • Registratie: Augustus 2003
  • Laatst online: 15:35
Ik heb het niet helemaal gelezen, maar ik denk dat je met de functie array-multisort() er wel uit moet komen.

  • pedorus
  • Registratie: Januari 2008
  • Niet online
tom.keim schreef op zaterdag 19 september 2009 @ 10:34:
Ik kon me niet bedenken hoe je hiervan een query kan samenvoegen met die andere, en het dan om het contract uren kan sorteren. Daarom wou ik het op die andere manier doen, maar die lukt dus ook niet :(
Had je niet beter een join kunnen gebruiken of een sql-tutorial erbij kunnen pakken :?

Vitamine D tekorten in Nederland | Dodelijk coronaforum gesloten


Verwijderd

pedorus schreef op zaterdag 19 september 2009 @ 13:26:

Had je niet beter een join kunnen gebruiken of een sql-tutorial erbij kunnen pakken :?
Dat dacht ik dus ook. Volgens mij is er weer eens een nieuw probleem gecreëerd door een verkeerde oplossing te bedenken voor een heel ander probleem.

Acties:
  • 0 Henk 'm!

  • devhouse
  • Registratie: Juli 2008
  • Laatst online: 01-12-2021
Ik heb nog nooit met JOIN gewerkt, en daar ook nog niet gekeken.

Maar ik weet niet hoe ik van JOIN gebruik kan maken in mijn situatie, er is bij mij geen relatie tussen 2 tabellen. Zijn er nog andere methoden om dit te doen?

Acties:
  • 0 Henk 'm!

  • HuHu
  • Registratie: Maart 2005
  • Niet online
tom.keim schreef op zondag 20 september 2009 @ 16:49:
Ik heb nog nooit met JOIN gewerkt, en daar ook nog niet gekeken.

Maar ik weet niet hoe ik van JOIN gebruik kan maken in mijn situatie, er is bij mij geen relatie tussen 2 tabellen. Zijn er nog andere methoden om dit te doen?
Er is wel een relatie tussen de tabellen. Want beide tabellen bevatten informatie over de persoon op wie de informatie van toepassing is.

Je hebt een tabel met users (die hebben een id) en een tabel met contracten van users (met een user_id). Er is dus een relatie tussen users.id en contracten.user_id.

Voorbeeld:

code:
1
2
3
4
SELECT *
FROM users as u
JOIN contracten as c
ON u.id = c.user_id

Acties:
  • 0 Henk 'm!

  • Xander
  • Registratie: Oktober 2002
  • Laatst online: 13:30
Even los van het feit dat het waarschijnlijk beter kan met puur SQL:

Met uasort kun je het sorteerprobleem inderdaad oplossen:

PHP:
1
2
3
4
5
6
7
8
9
function meukee($a, $b) {
    if ($a["order"] == $b["order"]) {
      return 0;
    } else {
      return ($a["order"] < $b["order"]) ? -1 : 1;
    }
}

uasort($array, 'meukee');

[ Voor 10% gewijzigd door Xander op 20-09-2009 16:59 ]

PC specs!---Pulse mee voor GoT!
[22:49:37] <@Remy> ik wil een opblaasbare dSLR :+


Acties:
  • 0 Henk 'm!

  • devhouse
  • Registratie: Juli 2008
  • Laatst online: 01-12-2021
ok ik heb nu de volgende query opgezet:
PHP:
1
2
3
4
$sql = "SELECT * ".
                "FROM staff AS s ".
                "JOIN contracts AS c ".
                "ON s.id = c.user_id";

ik dacht eerst dat hij werkt, maar de results uit deze query bevat iets raars.:
Array
(

[2] => Array
(
[id] => 3
[username] => t.keim
[password] =>
[name] =>
[type] => admin
[email] =>
[picture] =>
[reg_date] => 2009-08-29 11:06:46
[user_id] => 1
[since] => 2001-01-01
[until] => 2009-01-01
[hours] => 100
)

)

zoals je misschien kan zien klopt de user_id en de id hier niet, ze zijn niet gelijk, terwijl dit volgens de query wel moet. Volgens mij werkt de JOIN op dit moment dus niet goed. Heeft iemand een idee wat er mis kan zijn?

[ Voor 186% gewijzigd door devhouse op 20-09-2009 17:30 ]


Acties:
  • 0 Henk 'm!

  • magiel
  • Registratie: Januari 2005
  • Laatst online: 17-09 14:40
PHP:
1
2
3
<?php
$sql = "SELECT staff.*, contracts.contract FROM staff,contracts WHERE staff.id = contracts.user_id";
?>


Ik ben zelf niet zo'n held met JOIN enzo, maar kijk eens wat deze query uitspuugt?
Vervolgens kun je hier nog een ORDER BY achter zetten. Kijk daarvoor even in de mysql ORDER BY documentatie.

[ Voor 8% gewijzigd door magiel op 20-09-2009 17:26 ]

Ik wil het er _niet_ over hebben.


Acties:
  • 0 Henk 'm!

  • devhouse
  • Registratie: Juli 2008
  • Laatst online: 01-12-2021
bedankt allen!

de laatste fout kwam natuurlijk doordat er in de tabel contracts meer dan 2 id's waren, dan klopt het natuurlijk niet meer. ik heb nu het volgende, en het werkt. BEDANKT!

SQL:
1
2
3
4
5
6
SELECT *
FROM staff AS s
JOIN contracts AS c
ON s.id = c.user_id
WHERE c.since <= NOW() AND (c.until = '0000-00-00' OR c.until >= NOW())
ORDER BY c.hours DESC

Acties:
  • 0 Henk 'm!

  • Xander
  • Registratie: Oktober 2002
  • Laatst online: 13:30
Doe jezelf trouwens even een lol, en haal die password-hash en je e-mailadres even uit die post. Dat e-mailadres wordt zo gegarandeerd een keer opgepikt door een spambot.

PC specs!---Pulse mee voor GoT!
[22:49:37] <@Remy> ik wil een opblaasbare dSLR :+

Pagina: 1