[PHP] Array sorteren met case zonder key

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik heb een array met waardes die zowel kleine letters, als hoofdletters, als ook nummers en andere tekens bevat.

Deze array zou ik natural willen sorteren zonder dat er naar de case wordt gekeken. Tevens moeten alle waardes een nieuwe key krijgen, in de volgorde zoals er gesorteerd is.

natcasesort doet dit, behalve dat de keys bewaard blijven (wat dus niet de bedoeling is)

Het doorbladeren van de PHP handleiding (ik gebruik PHP 4) heeft me niet veel meer informatie kunnen verschaffen. Hier is een oud topic te vinden waar dezelfde vraag gesteld werd. Er werd echter weinig respons op gegeven en het scriptje wat er staat is me nogal onduidelijk.

Er wordt 'usort' genoemd. In de PHP handleiding staat een voorbeeld binnen een function, iets wat ik nog nooit begrepen heb. Verder staat er bijster weinig uitleg over usort in de handleiding.

Het volgende script wordt genoemd:
PHP:
1
2
3
4
5
6
7
8
9
<? 
//$namen = dus je originele array met namen. 

$_namen = natcasesort($namen); 
$nieuw = array(); 
foreach($_namen as $naam){ 
$nieuwe[]=$naam; 
} 
?>

Hier ontgaat me de werking ook van. Waarom wordt er een nieuw array "$nieuw" aangemaakt? Deze wordt verder niet meer gebruikt. Of moet het "$nieuwe" zijn, zoals verder weer terug komt?

Tot en met de foreach regel kom ik helemaal mee. Maar daarna wordt $naam opgeslagen in $nieuwe. Wat heb je dan bereikt?

Bovendien krijg ik een "Warning: Invalid argument supplied for foreach()" bij dit script.

Wellicht is het beter om dit script helemaal te vergeten.

Een handige oplossing (of gewoon een functie?) kom ik niet echt op.

Acties:
  • 0 Henk 'm!

  • crisp
  • Registratie: Februari 2000
  • Nu online

crisp

Devver

Pixelated

Dat kan met usort en strnatcasecmp:
PHP:
1
2
3
4
5
6
7
8
$a = array('foo', 'bar', 'Foo', 'BAR');

function naturalSort($a, $b)
{
    return strnatcasecmp($a, $b);
}

usort($a, 'naturalSort');

Intentionally left blank


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Dat ga ik eens proberen. Kan het ook gewoon zonder function?

Acties:
  • 0 Henk 'm!

  • Joolee
  • Registratie: Juni 2005
  • Niet online
Kan dat niet gewoon met natcasesort en array_values

Om het voorbeeld van php.net maar eventjes te gebruiken:
PHP:
1
2
3
4
$array = array('IMG0.png', 'img12.png', 'img10.png', 'img2.png', 'img1.png', 'IMG3.png');
natcasesort($array);
$array = array_values($array);
print_r($array);
Maakt:
code:
1
2
3
4
5
6
7
8
9
Array
(
    [0] => IMG0.png
    [1] => img1.png
    [2] => img2.png
    [3] => IMG3.png
    [4] => img10.png
    [5] => img12.png
)

Acties:
  • 0 Henk 'm!

  • Icelus
  • Registratie: Januari 2004
  • Niet online
Deze array zou ik natural willen sorteren zonder dat er naar de case wordt gekeken. Tevens moeten alle waardes een nieuwe key krijgen, in de volgorde zoals er gesorteerd is.
Waarom wil je dit per se? Als je met een for-each door 't array loopt krijg je de gesorteerde volgorde ook (en dan kun je direct de natcasesort functie gebruiken).

Met de usort functie kun je een eigen sorteerfunctie maken (user sort). Je geeft aan usort het array mee dat gesorteerd moeten worden en de naam van de sorteerfunctie. PHP zal voor alle waarden in het array nu deze sorteerfunctie aanroepen, twee per keer. Als de twee eerste waarde ($a) vóór de tweede waarde ($b) gesorteerd moeten worden dient de functie de waarde -1 terug te geven. Komt $a ná $b dan dient de waarde +1 terug te geven. Zijn beiden gelijk dan wordt 0 teruggegeven.

Developer Accused Of Unreadable Code Refuses To Comment


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Met een bedankje aan Jolee: _/-\o_

'array_values' was de functie die ik niet kon vinden.

De summiere beschrijving in de PHP handleiding luidt: "array_values() geeft alle waarden uit de input array terug."

Zzoals ik het begrijp worden alle keys overgeschreven naar nummerieke waarden, beginnend bij 0 en vervolgens oplopend.

In ieder geval is het simpel en doeltreffend.

Acties:
  • 0 Henk 'm!

  • Joolee
  • Registratie: Juni 2005
  • Niet online
Verwijderd schreef op zaterdag 05 mei 2007 @ 21:52:
Met een bedankje aan Jolee: _/-\o_

'array_values' was de functie die ik niet kon vinden.

De summiere beschrijving in de PHP handleiding luidt: "array_values() geeft alle waarden uit de input array terug."

Zzoals ik het begrijp worden alle keys overgeschreven naar nummerieke waarden, beginnend bij 0 en vervolgens oplopend.

In ieder geval is het simpel en doeltreffend.
Ik dacht eigenlijk dat er nog een functie zou zijn als array_key_reset. Maar array_values blijkt te voldoen.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Icelus schreef op zaterdag 05 mei 2007 @ 21:51:
[...]
Waarom wil je dit per se? Als je met een for-each door 't array loopt krijg je de gesorteerde volgorde ook (en dan kun je direct de natcasesort functie gebruiken).
Het is me niet helemaal duidelijk hoe ik die for-each aan de praat krijg, zoals in het voorbeeld beschreven.

Ik wil dit, omdat de ongesorteerde keys van de array geen enkele waarde hebben (zijn willekeurig). Zodra de array gesorteerd is en dus oplopende keys op de gesorteerde waardes heeft gekregen, kan ik met en for-lus de waardes in de juiste volgorde behandelen.
Joolee schreef op zaterdag 05 mei 2007 @ 21:55:
[...]
Ik dacht eigenlijk dat er nog een functie zou zijn als array_key_reset. Maar array_values blijkt te voldoen.
Zelf was ik op zoek naar een functie in de vorm van een combinatie als sort en natcasesort, waarbij de regels van natcasesort gelden en er ook direct een nieuwe keynummering verkregen wordt. Maar die blijkt niet te bestaan.

[ Voor 25% gewijzigd door Verwijderd op 05-05-2007 22:01 ]


Acties:
  • 0 Henk 'm!

  • Creepy
  • Registratie: Juni 2001
  • Nu online

Creepy

Tactical Espionage Splatterer

Verwijderd schreef op zaterdag 05 mei 2007 @ 21:58:
[...]

Het is me niet helemaal duidelijk hoe ik die for-each aan de praat krijg, zoals in het voorbeeld beschreven.

Ik wil dit, omdat de ongesorteerde keys van de array geen enkele waarde hebben (zijn willekeurig). Zodra de array gesorteerd is en dus oplopende keys op de gesorteerde waardes heeft gekregen, kan ik met en for-lus de waardes in de juiste volgorde behandelen.
Als de array juist is gesorteerd dan kan dat prima met foreach onafhankelijk van wat voor index de array gebruikt.
Zelf was ik op zoek naar een functie in de vorm van een combinatie als sort en natcasesort, waarbij de regels van natcasesort gelden en er ook direct een nieuwe keynummering verkregen wordt. Maar die blijkt niet te bestaan.
Omdat de keynummering ook niet nodig is met een foreach. Daarnaast is het een kleine moeite om eventueel zelf te maken :)

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


Acties:
  • 0 Henk 'm!

  • Joolee
  • Registratie: Juni 2005
  • Niet online
Verwijderd schreef op zaterdag 05 mei 2007 @ 21:58:
[...]

Het is me niet helemaal duidelijk hoe ik die for-each aan de praat krijg, zoals in het voorbeeld beschreven.
PHP:
1
2
3
4
5
6
7
8
9
10
$array = array();
$array['key9'] = 'waarde1';
$array['key6'] = 'waarde2';
$array['key4'] = 'waarde3';
$array['key2'] = 'waarde4';
$array['key5'] = 'waarde5';

foreach($array as $k => $v) {
    echo $k .' => '. $v.'<br>';
}

Echt lastig is een foreach loop niet :?
Pagina: 1