下面的数组应按第一个cat_url_title数排序。
Array
(
[0] => Array
(
[cat_id] => 14
[parent_id] => 2
[cat_url_title] => 20-a-43m
)
[1] => Array
(
[cat_id] => 13
[parent_id] => 2
[cat_url_title] => 16-a-20m
)
[2] => Array
(
[cat_id] => 12
[parent_id] => 2
cat_url_title] => 12-a-16m
)
)
//get the first number
foreach( $arr as $k => $v )
{
$segs = explode("-",$v['cat_url_title']);
$nbr = $segs[0]; //this will be 20, 16 or 12
}
)
12应该是$ arr [0],16应该是$ arr [1]和20 $ $ arr [0]。我怎样才能做到这一点?
答案 0 :(得分:3)
答案 1 :(得分:3)
你得到了一个好方法,在获得第一个数字之后创建一个新数组,其中包含数字作为键,数组内容为值:
$newArray = array();
foreach($arr as $k => $v)
{
$segs = explode("-", $v['cat_url_title']);
$newArray[ $segs[0] ] = $v;
}
ksort($newArray);
print_r($newArray);
应该有用。
答案 2 :(得分:2)
请参阅usort() php函数。
关于php中数组排序函数的有趣页面:http://us.php.net/manual/en/array.sorting.php
答案 3 :(得分:0)
这是我用来排序数组的函数:
function array_sort($array, $on, $order='SORT_DESC' /*or SORT_ASC*/ )
{
$new_array = array();
$sortable_array = array();
if (count($array) > 0) {
foreach ($array as $k => $v) {
if (is_array($v)) {
foreach ($v as $k2 => $v2) {
if ($k2 == $on) {
$sortable_array[$k] = $v2;
}
}
} else {
$sortable_array[$k] = $v;
}
}
switch($order)
{
case 'SORT_ASC':
asort($sortable_array);
break;
case 'SORT_DESC':
arsort($sortable_array);
break;
}
foreach($sortable_array as $k => $v) {
$new_array[] = $array[$k];
}
}
return $new_array;
}
用法:
array_sort($restaurants_top, "score", 'SORT_DESC');
$ restaurants_top =餐馆列表 “得分”=数组键 SORT_DESC =排序方向
答案 4 :(得分:0)
一衬垫:
array_multisort(array_map('end', $array), SORT_NUMERIC, $array);
假设:
$array = array (
0 => array (
'cat_id' => 14,
'parent_id' => 2,
'cat_url_title' => '20-a-43m'
),
1 => array (
'cat_id' => 13,
'parent_id' => 2,
'cat_url_title' => '16-a-20m'
),
2 => array (
'cat_id' => 12,
'parent_id' => 2,
'cat_url_title' => '12-a-16m'
)
);
答案 5 :(得分:0)
Tomasz对array_multisort()的建议是一种聪明,声明性和简洁的技术,已在php版本中使用了很多年。如果此任务在我的项目中,我可能会使用array_multisort()
。
为了项目的稳定性(如果数据结构被扩展/更改),我可能建议明确命名要排序的列。以下代码段也避免了进行迭代的end()
调用。
array_multisort(array_column($array, 'cat_url_title'), SORT_NUMERIC, $array);
作为学术练习,我将展示几种现代的替代方法。
从PHP7开始,spaceship operator还提供了简洁的语法。为了在第一个连字符之前将数字子字符串隔离开,将字符串转换为整数。
usort($array, function($a, $b) {
return (int)$a['cat_url_title'] <=> (int)$b['cat_url_title'];
});
从PHP7.4开始,arrow function syntax使得usort()
的调用更加简洁,但如果您不习惯使用这种语法,则可以说更难以理解。
usort($array, fn($a, $b) => (int)$a['cat_url_title'] <=> (int)$b['cat_url_title']);
与我几乎所有的php帖子一样,这里是an online demo,以证明我的所有摘要均按预期运行。
应避免此页面上多次迭代输入数组的代码段。
p.s。如果您希望对四个数字/字母子字符串上的cat_url_title
值进行排序,则可以将这些子字符串作为数组写入太空飞船运算符的每一侧,并且它将从左到右评估子字符串以确定排序结果。
代码:(Demo)
usort($array, function($a, $b) {
return (preg_match_all('~[a-z]+|\d+~', $a['cat_url_title'], $out) ? $out[0] : ['','','',''])
<=>
(preg_match_all('~[a-z]+|\d+~', $b['cat_url_title'], $out) ? $out[0] : ['','','','']);
});
p.p.s。对于version_compare()
,这可能是个好例子。不幸的是,对于我的测试电池中的琴弦,它不可靠。注意demo中16-a-20n
子数组的最终位置。我认为该函数会忽略最后一个字母,因为计算结果是0
和16-a-20m
之间的16-a-20n
。
对于具有一致的a
和m
子字符串位置的示例字符串,它可以完美地自然排序。
代码:(Demo)
usort($array, function($a, $b) {
return version_compare($a['cat_url_title'], $b['cat_url_title']);
});