PHP按键和非零值对多维数组进行排序

时间:2014-10-11 06:14:25

标签: php arrays sorting multidimensional-array

[a, 1, 3, 9, 0, 13]
[b, 5, 6, 0, 0, 11]
[j, 0, 6, 2, 1, 9]
[c, 1, 0, 8, 5, 14]
[d, 0, 0, 0, 17, 17]
[e, 0, 5, 0, 0, 5]
[h, 0, 0, 3, 3, 6]

数组需要在

上排序
  1. 零个数的升序。
  2. 最后一个元素值的升序。
  3. 所以排序后的上面数组应该是,

     [j, 0, 6, 2, 1, 9]
     [a, 1, 3, 9, 0, 13]
     [c, 1, 0, 8, 5, 14]
     [h, 0, 0, 3, 3, 6]
     [b, 5, 6, 0, 0, 11]
     [d, 0, 5, 0, 0, 5]
     [d, 0, 0, 0, 17, 17]
    

    我通过此代码

    正常地将多维数组排序到最后一个值
    function multiarraysorter($arr, $index) {
        $b = array();
        $c = array();
        foreach ($arr as $key => $value) {
            $b[$key] = $value[$index];
        }
    
        asort($b);
    
        foreach ($b as $key => $value) {
            $c[] = $arr[$key];
        }
    
        return $c;
    }
    

    任何想法如何完成基于值的零数的第一种排序?

2 个答案:

答案 0 :(得分:1)

您可以使用usort执行以下任务:

$arr=[['a', 1, 3, 9, 0, 13],['b', 5, 6, 0, 0, 11],['j', 0, 6, 2, 1, 9],['c', 1, 0, 8, 5, 14],['d', 0, 0, 0, 17, 17],['e', 0, 5, 0, 0, 5],['h', 0, 0, 3, 3, 6]];

usort($arr,function($a,$b){
    $infoa=array_count_values($a);
    $infob=array_count_values($b);
    if(empty($infoa[0])) $infoa[0]=0;
    if(empty($infob[0])) $infob[0]=0;
    if($infoa[0]==$infob[0])
    {
        return end($a)-end($b);
    }
    else
    {
        return $infoa[0]-$infob[0];
    }
});

print_r($arr);

3v4l.org demo

生成的输出为:

Array
(
    [0] => Array
        (
            [0] => j
            [1] => 0
            [2] => 6
            [3] => 2
            [4] => 1
            [5] => 9
        )

    [1] => Array
        (
            [0] => a
            [1] => 1
            [2] => 3
            [3] => 9
            [4] => 0
            [5] => 13
        )

    [2] => Array
        (
            [0] => c
            [1] => 1
            [2] => 0
            [3] => 8
            [4] => 5
            [5] => 14
        )

    [3] => Array
        (
            [0] => h
            [1] => 0
            [2] => 0
            [3] => 3
            [4] => 3
            [5] => 6
        )

    [4] => Array
        (
            [0] => b
            [1] => 5
            [2] => 6
            [3] => 0
            [4] => 0
            [5] => 11
        )

    [5] => Array
        (
            [0] => e
            [1] => 0
            [2] => 5
            [3] => 0
            [4] => 0
            [5] => 5
        )

    [6] => Array
        (
            [0] => d
            [1] => 0
            [2] => 0
            [3] => 0
            [4] => 17
            [5] => 17
        )

)

答案 1 :(得分:0)

尝试此工作:

<?php
$res_ary = array(); 

  $res_ary = sortArray($arr,'key_value');
?>
在sortArray函数中,您传递两个参数,一个是数组,您想要简短,第二个是键值,您必须对其进行排序。

<?php

function sortArray($arrData, $p_sort_field, $p_sort_type = false )
{
 if(!empty($arrData))
 {
  foreach($arrData as $data)
  {
   $newData [] = $data;
  }
  for($i=0; $i<count($newData); $i++)
  {                       
    $ar_sort_field[$i]=$newData[$i][$p_sort_field];
  }
  array_multisort($ar_sort_field, ($p_sort_type ? SORT_DESC : SORT_ASC), $newData);   
  return $newData;
 }
}

?>