sort()は引き数として渡した配列を直接ソートする。また降順にするにはrsort()を使う。
# Perl
@outArray = sort @inArray;
@outArray = sort {$b cmp $a} @inArray;
// PHP $success = sort($inoutArray); $success = rsort($inoutArray);
文字列の場合と同じようにすればよい。
# Perl
@outArray = sort {$a <=> $b} @inArray;
@outArray = sort {$b <=> $a} @inArray;
そのままsort()すると文字列と数が別々にソートされてしまうのでSORT_STRINGを指定する。
# Perl @outArray = sort @inArray;
// PHP $success = sort($inoutArray, SORT_STRING);
Perlでは$a, $bが比較内容を保持する変数として予約されているが、(当然)PHPにはこの仕様はない。
# Perl
@outArray = sort userfunc @inArray;
sub userfunc {
return $a->{'year'} <=> $b->{'year'} || $a->{'name'} cmp $b->{'name'};
}
// PHP
$success = usort($inoutArray, 'userfunc');
function userfunc($a, $b)
{
if (($result = ($a['year'] - $b['year'])) == 0) {
$result = strcmp($a['name'], $b['name']);
}
return $result;
}
# Perl
@outArray = sort {
$a->{'year'} <=> $b->{'year'} || $a->{'name'} cmp $b->{'name'}
} @inArray;
// PHP
$success = usort($inoutArray, function ($a, $b) { // PHP 5.3+
return
($a['year'] <=> $b['year']) // PHP 7.0+
?: // PHP 5.3+
strcmp($a['name'], $b['name']);
});
PHPには文字列中の、桁数の揃っていない数字を並び替える時に使えるnatural orderingという方式のnatsort()やnatcasesort()がある。
# Perl
my @outArray = sort strnatcmp @inArray;
sub strnatcmp {
my $max = sub { $_[0] > $_[1] ? $_[0] : $_[1] };
my @a = split(/(\d+)/a, $a);
my @b = split(/(\d+)/a, $b);
my ($an, $bn);
for (0..$max->($#a, $#b)) {
my $l = $max->(length($a[$_]), length($b[$_]));
$an .= $a[$_] =~ /^\d/a ? sprintf('%0*d', $l, $a[$_]) : $a[$_];
$bn .= $b[$_] =~ /^\d/a ? sprintf('%0*d', $l, $b[$_]) : $b[$_];
}
return $an cmp $bn;
}
// PHP $success = natsort($inoutArray);
すでに述べた通りPHPではPerlと異なり配列と連想配列の区別がない。つまり連想配列にもインデックスがある。
連想配列をキーでソートするにはksort()やkrsort()を使う。
# Perl
foreach $key (sort keys %hash) {
...
}
// PHP
ksort($hash);
foreach ($hash as $key => $value) {
...
}
usort()の連想キー版であるuksort()を使う。
sort()は連想キーを消してしまうので使えない。値でソートするにはasort()やarsort()を使う。
# Perl
foreach $key (sort { $hash{$a} cmp $hash{$b} } keys %hash) {
...
}
// PHP
asort($hash);
foreach ($hash as $key => $value) {
...
}