簡體   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]

數組需要排序

  1. 零數的升序。
  2. 最后一個元素值的升序。

所以上面的數組經過排序應該看起來像,

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

有什么想法如何完成基於值的零數目的第一排序?

您可以將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演示

生成的輸出為:

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
        )

)

試試這個它的工作:

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

?>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM