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

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

问题描述:

I have an array containing multiple arrays like

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

I want to sort the values in multiple arrays in the order of frequency and put them into another array let's say $B.

The values in $B is "1","1","1","3","3","0","2","4","5","6","7","8".

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

  $ A  = array(); 
 $ A [0] =数组(“1”,“2”,“3”,“4”,“5”); 
 $ A [1] =数组(“1”,  “6”,“7”,“8”); 
 $ A [2] =数组(“0”,“1”,“3”); 
  code>  pre> 
 
  

我想按频率顺序对多个数组中的值进行排序,并将它们放入另一个数组中,假设为$ B. p>

$ B中的值为“1”,“ 1“,”1“,”3“,”3“,”0“,”2“,”4“,”5“,”6“,”7“,”8“。 p>

$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>";

Result

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
)
</div>

  1. First merge all arrays

    $array1 = array("color" => "red", 2, 4);

    $array2 = array("a", "b", "color" => "green", "shape" => "trapezoid", 4);

    $resultado = array_merge($array1, $array2);

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

  1. Second sort the big array

    arsort($resultado );

    see -> http://php.net/manual/es/array.sorting.php

Use a hash table to count the frequency of each number, and then store them in the decreasing order of frequency in array $B, like this:

$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 

If order of same occurance count items isn't important, you can use:

// 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);

Output

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