【问题标题】:sort an array for top books in php在php中对顶级书籍的数组进行排序
【发布时间】:2014-11-13 07:27:05
【问题描述】:

这是一个问题,我必须在 php 中找到最畅销的书和每本书的读者数量。数组如下

$input=array();
$input[]=array("Harrypotter","John");
$input[]=array("Twilight","Jack");
$input[]=array("Twilight","John");
$input[]=array("Harrypotter","Jack");
$input[]=array("Gonegirl","marion");
$input[]=array("Gonegirl","marion");
$input[]=array("Gonegirl","John");
$input[]=array("Gonegirl","eliza");

我可以通过将书名复制到一个单独的数组(比如 temparray )中找到最上面的书,并使用以下函数

$temparray = array_count_values($temparray);
arsort($temparray);

但我无法弄清楚如何获取每本书的读者数量的逻辑,读者名称可能会重复,因此我们必须消除重复的名称。任何快速排序的方法都会有所帮助.

【问题讨论】:

标签: php arrays


【解决方案1】:

您可以先获取每本书的名称以创建一个平面数组,然后再应用计数。示例:

$input=array();
$input[]=array("Harrypotter","John");
$input[]=array("Twilight","Jack");
$input[]=array("Twilight","John");
$input[]=array("Harrypotter","Jack");
$input[]=array("Gonegirl","marion");
$input[]=array("Gonegirl","test");
$input[]=array("Gonegirl","John");
$input[]=array("Gonegirl","eliza");

$input = array_map('unserialize', array_unique(array_map('serialize', $input)));
// remove dups
$temparray = array_map(function($book_name){
    return $book_name[0]; // get book names
}, $input);
$temparray = array_count_values($temparray); // then apply the counting
arsort($temparray);

print_r($temparray); // Array ( [Gonegirl] => 3 [Twilight] => 2 [Harrypotter] => 2 )

【讨论】:

  • 可能是两个marion 值不是错误的吗? ;) the reader names may repeat so we have to eliminate the repeated ones
  • @vp_arth 我只能在我这边猜测,让我们等待 OP 是否真的打算这样做
  • 用户名确实重复,我正在尝试将逻辑应用于其他问题,例如我必须对同一用户可以多次访问同一网站的顶部 url 进行排序
  • @SanthoshPai 哦,好吧,所以它可以重复,也需要计算
  • @Ghost : 反过来,重复的用户不应该被计算在内。我不明白该怎么做。
【解决方案2】:
$input=array();
$input[]=array("Harrypotter","John");
$input[]=array("Twilight","Jack");
$input[]=array("Twilight","John");
$input[]=array("Harrypotter","Jack");
$input[]=array("Gonegirl","marion");
$input[]=array("Gonegirl","marion");
$input[]=array("Gonegirl","John");
$input[]=array("Gonegirl","eliza");

$hash = array();
$sorted = array();
array_walk($input, function ($v) use (&$hash, &$sorted) {
    $book = $v[0];
    if (!in_array(implode('_', $v), $hash)) {
        $hash[] = implode('_', $v);
        !isset($sorted[$v[0]])?$sorted[$v[0]]=1:$sorted[$v[0]]++;
    }
});
arsort($sorted);
print_r($sorted);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-03-24
    • 1970-01-01
    • 2010-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多