简体   繁体   English

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

[英]PHP sorting a multidimensional array by key and non-zero values

[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]

The array needs to be sorted on 数组需要排序

  1. Ascending order of number of zeroes. 零数的升序。
  2. Ascending order of last element value. 最后一个元素值的升序。

So the above array after sorting should look like, 所以上面的数组经过排序应该看起来像,

 [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]

I am sorting the multidimensional array normally against the last value via this code 我通常通过此代码针对最后一个值对多维数组进行排序

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;
}

Any ideas how to accomplish the first sort that is based on number of zeroes of the values? 有什么想法如何完成基于值的零数目的第一排序?

You can use usort for tasks like this: 您可以将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 3v4l.org演示

The generated output is: 生成的输出为:

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
        )

)

Try This its working : 试试这个它的工作:

<?php
$res_ary = array(); 

  $res_ary = sortArray($arr,'key_value');
?>

in sortArray function you pass two parameters first one is array you want to short and second one is key value on which you have to do sorting. 在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;
 }
}

?>

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM