PHP按自定义值对数组进行排序

时间:2011-05-06 10:20:33

标签: php

下面的数组应按第一个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]。我怎样才能做到这一点?

6 个答案:

答案 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(),这可能是个好例子。不幸的是,对于我的测试电池中的琴弦,它不可靠。注意demo16-a-20n子数组的最终位置。我认为该函数会忽略最后一个字母,因为计算结果是016-a-20m之间的16-a-20n

对于具有一致的am子字符串位置的示例字符串,它可以完美地自然排序。

代码:(Demo

usort($array, function($a, $b) {
    return version_compare($a['cat_url_title'], $b['cat_url_title']);
});