按相同对象的数量排序PHP数组

时间:2010-05-02 20:41:35

标签: php arrays

无论如何以这种方式订购数组?例如,如果我有这个数组:

$array = array("foo", "bar", "item", "item", "foo", "foo");

我想订购它以便它是“foo”,“foo”,“foo”,“item”,“item”,“bar”有没有办法做到这一点?

6 个答案:

答案 0 :(得分:4)

这会吗?

$array1 = array_count_values($array);
arsort($array1);
var_dump($array1);

会给你

array(3) {
  ["foo"]=>
  int(3)
  ["item"]=>
  int(2)
  ["bar"]=>
  int(1)
}

或者您是否一定需要它们作为重复值?如果是的话,你可以选择以下内容:

usort($array,create_function('$a,$b',
    'return $GLOBALS["array1"][$a]<$GLOBALS["array1"][$b];'));

这是丑陋的代码,但演示了这项技术。使用php 5.3关闭也很容易让它看起来很好看,但我不知道你是否在使用5.3。这看起来像这样:

$acount=array_count_values($array = array("foo", "bar", "item", "item", "foo", "foo"));
usort($array,function($a,$b) use ($acount) { return $acount[$a]<$acount[$b]; });

答案 1 :(得分:2)

首先,您必须计算每个值的出现次数(array_count_values),然后使用usort按您的条件对元素进行排序:

<?php

$array = array('foo', 'bar', 'bar', 'foo', 'bar', 'foo', 'foobar', 'foo', 'foo', 'foobar', 'bar', 'foo');

$tmp = array_count_values($array);
usort($array, function($e1, $e2) use($tmp) {
    return $tmp[$e2] - $tmp[$e1];
});

var_dump($array);

答案 2 :(得分:1)

usort()可行。 array_count_values()虽然派上了用场。通过您需要进行的计算,这可能会更加清晰和有效。如果有很多重复值(100+),您可能还需要考虑使用array_fill()而不是for循环:

function getSortedGroupArray($array) {
  $return = array();
  $values = array_count_values($array);
  sort($values);
  foreach($values as $count => $value) {
    for($i = 0; $i < $count; ++$i) {
      $return[] = $value;
    }
  }
  return $return
}

答案 3 :(得分:0)

这是一个非常不寻常的排序过程,最简单的做法是两步或三步。

首先计算不同的对象,然后对对象进行排序并从中生成已排序的对象数组。

答案 4 :(得分:0)

让我们试试这个:

// First, lets count the number of objects  
$sort_by_term = array();
foreach($array as $string)
{
   if(isset($sort_by_term[$string]))
   {
       $sort_by_term[$string] += 1;
   }
   else
   {
       $sort_by_term[$string] = 1;
   }
}

// Next let's sort them by number
$sort_by_count = array();
foreach($sort_by_term as $term => $count)
{
    $sort_by_count[$count][] = $term;
}

// Now lets combine them
$final_array = array();
foreach($sort_by_count as $count => $term)
{
    while($count > 0)
    {
        $final_array[] = $term;
        $count -= 1;
    }
}

可以使用PHP的一些功能进行缩短,但是您可以了解必须完成的工作。

答案 5 :(得分:0)

您可以使用以下函数按值在数组中出现的频率进行排序:

function array_count_sort(&$array, $direction = 1)
{
    // Could do with a better way of making $counts and $dir available to the
    // sorting function, but this will do for illustrative purposes.
    global $counts, $dir; 
    $counts = array_count_values($array);
    $dir = $direction;

    if (!function_exists('array_count_sort_cmp')) {
        function array_count_sort_cmp($a, $b) {
            global $counts, $dir;

            $c = $counts[$a];
            $d = $counts[$b];

            if ($c == $d) return 0;
            return ($c < $d) ? -$dir : $dir;
        }
    }

    usort($array, 'array_count_sort_cmp');
}

并按以下方式使用它:

$test = array("foo", "bar", "item", "item", "foo", "foo");
print_r($test);
array_count_sort($test);
print_r($test);
array_count_sort($test, -1);
print_r($test);

会产生

Array
(
    [0] => foo
    [1] => bar
    [2] => item
    [3] => item
    [4] => foo
    [5] => foo
)
Array
(
    [0] => bar
    [1] => item
    [2] => item
    [3] => foo
    [4] => foo
    [5] => foo
)
Array
(
    [0] => foo
    [1] => foo
    [2] => foo
    [3] => item
    [4] => item
    [5] => bar
)