Archief - PHP: array sorteren.

Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.

Bram

Legacy Member
M'n script leest een dir uit en de bestanden die erin staan, aan de hand van een soort xml tags in die bestanden worden enkele properties per bestand in een array gestoken. Nu worden deze bestanden echter alfabetisch gelezen (logisch), maar in die tags wordt er ook een positie gedefinieerd en ik zou eigenlijk graag m'n array daarop sorteren, maar ik heb geen idee hoe dit te doen...
array_multisort is het denk ik niet, en met usort zou ik niet weten welke custom functie ik moet schrijven...

iemand?
PHP:
Array
(
    [Content] => Array
        (
            [filename] => C:/wamp/www//admin/modules/content.php
            [pos] => 8
            [subnav] => Add page, Edit pages
            [dependent] => 
        )

    [Users] => Array
        (
            [filename] => C:/wamp/www//admin/modules/users.php
            [pos] => 4
            [subnav] => Manage Users, My profile
            [dependent] => 
        )

)

0n3Liner

Legacy Member
http://be.php.net/array_multisort

This is my solution for a dynamic multisort, using POST values. This doesn't account for a need to sort by multiple columns at once, but could be modified for that purpose.

PHP:
<?php
    /**
    * @desc You really should validate the posted sort direction against a list of valid possibilities.
    *         Options are SORT_ASC, SORT_DESC, etc, as shown in the documentation for array_multisort
    */
    $sort['direction'] = $_POST['sort_direction'] ? $_POST['sort_direction'] : 'SORT_ASC';
    $sort['field']       = $_POST['sort_field'] ? $_POST['sort_field'] : 'value';

    $array_to_sort = array();   
    $array_to_sort['TestCase1'] = array('name'=>'Test1','value'=>'218');
    $array_to_sort['TestCase2'] = array('name'=>'Test2','value'=>'10');
    $array_to_sort['TestCase3'] = array('name'=>'Test3','value'=>'64');
   
    /**
    * @desc Build columns using the values, for sorting in php
    */
    $sort_arr = array();
    foreach($array_to_sort AS $uniqid => $row){
        foreach($row AS $key=>$value){
            $sort_arr[$key][$uniqid] = $value;
        }
    }
   
    print '<b>Before sorting</b>: <br> <pre>';
    print_r($array_to_sort);
    print '</pre>';
   
    if($sort['direction']){
        array_multisort($sort_arr[$sort['field']], constant($sort['direction']), $array_to_sort);
    }

    print '<b>After sorting</b>: <br> <pre>';
    print_r($array_to_sort);
    print '</pre>';
   
?>

This example prints out:

Before sorting:

Array
(
[TestCase1] => Array
(
[name] => Test1
[value] => 218
)

[TestCase2] => Array
(
[name] => Test2
[value] => 10
)

[TestCase3] => Array
(
[name] => Test3
[value] => 64
)

)

After sorting:

Array
(
[TestCase2] => Array
(
[name] => Test2
[value] => 10
)

[TestCase3] => Array
(
[name] => Test3
[value] => 64
)

[TestCase1] => Array
(
[name] => Test1
[value] => 218
)

)

Bram

Legacy Member
hmm, niet goed genoeg gekeken. Heel hard bedankt! Werkt !

edit: nu ik hier toch een topic heb openstaan:

PHP:
foreach($this->modules as $name => $props) {
	if(@!in_array($name, $this->permissions)) {
		$short = strtolower(str_replace(' ', '-', $name));
		$this->navItems['main'][$short] = $name;
	}
}
Ik heb die @ daar gezet omdat het script warnings geeft als $this->permissions leeg is... Kan dit eigenlijk veel kwaad? Ik veronderstel van niet, maar vraag het toch maar eens voor de zekerheid.

Rvl

Legacy Member
Als je die warning opvangt op de een of andere manier kan het geen kwaad nee

killgore

Legacy Member
SveltestSword zei:
hmm, niet goed genoeg gekeken. Heel hard bedankt! Werkt !

edit: nu ik hier toch een topic heb openstaan:

PHP:
foreach($this->modules as $name => $props) {
	if(@!in_array($name, $this->permissions)) {
		$short = strtolower(str_replace(' ', '-', $name));
		$this->navItems['main'][$short] = $name;
	}
}
Ik heb die @ daar gezet omdat het script warnings geeft als $this->permissions leeg is... Kan dit eigenlijk veel kwaad? Ik veronderstel van niet, maar vraag het toch maar eens voor de zekerheid.

Rvl zei:
Als je die warning opvangt op de een of andere manier kan het geen kwaad nee

eigenlijk kan het sowieso niet immens kwaad gezien het 'gewenst' gedrag is. Maar gebruik hiervoor dan toch liever de betere isset functie ;). edit: tenzij je arrays null moet kunnen bevatten, dan is het correctste eigenlijk dit:

PHP:
 if(!isset($arraynaam) || !array_key_exists(...) )
{
...
}
Iets omslachtiger, maar je gaat er geen fouten mee omzeilen. Je kan nooit weten dat array_key_exists faalt om een andere reden.

Bram

Legacy Member
dan zou het bijna beter zijn om in $this->permissions een standaard waarde van "none" te steken, aangezien er geen enkele pagina none zal noemen :p
Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.
Terug
Bovenaan