You are here: Re: print order of assoctive array « PHP Programming Language « IT news, forums, messages
Re: print order of assoctive array

Posted by Ewoud Dronkert on 10/27/19 11:34

pauld wrote:
> the added problem is that I have a series of these and would ideally
> like to to generate the array name dynamically.

First an explanation of what I wrote earlier:

$oxchr = array(
'21', 'NC2', 'NC4', '28', '35', '40', '50', '60', '80', '100');
$oxord = array_flip($oxchr);

function oxkeysort($k1, $k2) {
global $oxord;
return $oxord[$k1] - $oxord[$k2];
}

uksort($val, 'oxkeysort');

The $oxchr array contains all the keys of the array that you want sorted,
in the order that you want them sorted. Not shown but implied by omitting
them are the numerical keys of the $oxchr array, from 0 for '21' to 9 for
'100'. 'Flipping' an array means switching each key-value pair. So $oxord
contains array('21' => 0, 'NC2' => 1, ..., '100' => 9). I loaned the
variable names from the chr() and ord() functions because $oxchr[1] gives
'NC2' while $oxord['NC2'] gives 1, much the same as chr(65) is 'A' and
ord('A') is 65. It means you can determine the order of the oxygen label
keys by accessing the $oxord array. The oxkeysort() function does just
that by returning the difference between two $oxord values. Zero means
that the same key was used, negative means that the first was smaller than
the second (ie. already sorted in ascending order) and positive the
reverse: 1 was bigger than 2, must be swapped for ascending order.
Finally, the uksort() function puts it to good use by sorting the $val
array using the supplied function for comparing the keys of $val, those
keys being the same oxygen labels defined as values in $oxchr.

Now, if you want to have more user defined sorting orders, my first
instinct would be to expand the chr and ord arrays to 2 dimensions:

$mychr = array(
'oxy' => array(
'21', 'NC2', 'NC4', '28', '35', '40', '50', '60', '80', '100'),
'physio' => array(
'John', 'Joe', 'Anne', 'Marie'));
$myord = array();
foreach ($mychr as $k => $v)
$myord[$k] = array_flip($v);

So $mychr['oxy'] is the same as $oxchr previously, likewise $myord['oxy']
and $oxord. In addition, you now have $myord['physio'].

My second idea would be to maintain the idea of my first code snippet: to
use a global variable in the user defined sort function for accessing the
sort order. But that order can now be different each time. So use a
"pointer" to the currently used one:

$curord = 'oxy';
function mykeysort($k1, $k2) {
global $myord, $curord;
return $myord[$curord][$k1] - $myord[$curord][$k2];
}

Or perhaps one level up for slightly simpler code inside the function,
although speed of execution could go either way depending on size of the
arrays and calling frequency of the different functions:

$curord = $myord['oxy'];
function mykeysort($k1, $k2) {
global $curord;
return $curord[$k1] - $curord[$k2];
}

Of course, the global $curord need not be set right away. Each time before
you call uksort(), first set the appropriate sort order:

$curord = 'oxy'; //or $curord = $myord['oxy'];
uksort($val, 'mykeysort'); //$val contains oxygen label keys

$curord = 'physio'; //or $curord = $myord['physio'];
uksort($val, 'mykeysort'); //$val contains physio label keys

As you can see, the function name inside uksort() doesn't change. You must
update $curord each time though, which I think you can do "dynamically".

--
E. Dronkert

 

Navigation:

[Reply to this message]


Удаленная работа для программистов  •  Как заработать на Google AdSense  •  England, UK  •  статьи на английском  •  PHP MySQL CMS Apache Oscommerce  •  Online Business Knowledge Base  •  DVD MP3 AVI MP4 players codecs conversion help
Home  •  Search  •  Site Map  •  Set as Homepage  •  Add to Favourites

Copyright © 2005-2006 Powered by Custom PHP Programming

Сайт изготовлен в Студии Валентина Петручека
изготовление и поддержка веб-сайтов, разработка программного обеспечения, поисковая оптимизация