无论如何以这种方式订购数组?例如,如果我有这个数组:
$array = array("foo", "bar", "item", "item", "foo", "foo");
我想订购它以便它是“foo”,“foo”,“foo”,“item”,“item”,“bar”有没有办法做到这一点?
答案 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
)