php 如何按频率顺序对多个数组中的值进行排序


php how to sort the values in multiple arrays in the order of frequency

>我有一个包含多个数组的数组,例如

$A = array();
$A[0] = array("1","2","3","4","5");
$A[1] = array("1","6","7","8");
$A[2] = array("0","1","3");

我想按频率顺序对多个数组中的值进行排序,并将它们放入另一个数组中,比如说$B。

$B中的值为"1"、"1"、"1"、"3"、"3"、"0"、"2"、"4"、"5"、"6"、"7"、"8"。

$A = array();
$A[0] = array("1","2","3","4","5");
$A[1] = array("1","6","7","8");
$A[2] = array("0","1","3");
//Merging above array in to one array
$merged = array_values(call_user_func_array('array_merge', $A));
//Getting occurrence count
$counts = array_count_values($merged);
//Sort by count
arsort($counts);
//Adding to required array
$B = array();
foreach ($counts as $k => $v)
	for($i=1;$i<=$v;$i++)
		$B[] = $k;
echo "<pre>";
print_r($B);
echo "</pre>";

结果

Array
(
    [0] => 1
    [1] => 1
    [2] => 1
    [3] => 3
    [4] => 3
    [5] => 0
    [6] => 8
    [7] => 7
    [8] => 5
    [9] => 2
    [10] => 4
    [11] => 6
)
  1. 首先合并所有数组

    $array 1 = 数组("颜色" => "红色", 2, 4);

    $array 2 = 数组("a", "b", "color" => "green", "

    shape" => "梯形", 4);

    $resultado = array_merge($array 1, $array 2);

见 -> http://php.net/manual/es/function.array-merge.php

  1. 对大数组进行第二次排序

    分类($resultado );

    请参阅 -> http://php.net/manual/es/array.sorting.php

使用哈希表计算每个数字的频率,然后将它们按频率的降序存储在数组$B中,如下所示:

$hash_table = array();
foreach($A as $array){
    foreach($array as $value){
        if(empty($hash_table[$value])){
            $hash_table[$value] = 1;
        }else{
            $hash_table[$value] += 1;
        }
    }
}
arsort($hash_table);
$B = array();
foreach($hash_table as $key => $value){
    for($i = 0; $i < $value; ++$i){
        $B[] = $key;
    }
}
var_dump($B);  // to see the contents of array $B 

如果相同出现次数的顺序不重要,则可以使用:

// Merge all arrays
$counts = array_count_values(call_user_func_array('array_merge', $A));
// Sort by occurance
arsort($counts);
// Add [value] to new array [occurance] times
$B = array();
array_walk($counts, function($occurances, $value) use (&$B){
    for($i=0;$i<$occurances;$i++) $B[] = $value;
});
echo implode(',', $B);

输出

1,1,1,3,3,0,8,7,5,2,4,6

Array print in order of count and index:
$temp = array();
foreach($A as $b){
    foreach($b as $c){
        if(isset($tmep[$c])){
            $tmep[$c]++;
        }else{
            $tmep[$c] = 1;
        }
    }
}
function SortArrayByKeyThanValue (&$pArray, $pSortMethodForKey = SORT_ASC, $pSortMethodForValue = SORT_DESC){
    # check user input: sorting is not necessary
    if (count($pArray) < 2)
        return;
    # define $k and $v as array_multisort() needs real variables, as user input is put by reference
    $k = array_keys  ($pArray);
    $v = array_values($pArray);
    array_multisort(
        $v, $pSortMethodForValue,
        $k, $pSortMethodForKey
    );
    $pArray = array_combine($k, $v);
}
SortArrayByKeyThanValue($tmep); 
$B = array();
array_walk($tmep, function($occurances, $value) use (&$B){
    for($i=0;$i<$occurances;$i++) $B[] = $value;
});
echo implode(',', $B);