PHP - 在数组中查找唯一值

时间:2018-06-08 10:18:16

标签: php arrays foreach

我正在创建一个电子商务网站,并试图获得最畅销产品列表。

以下示例显示了一系列来自销售的产品ID,并以'product id' x 'number of sales'

的形式输出了畅销产品
<?php
$product_ids = [58,58,68,39,4,118,14,54,39,118,58];
$top_selling_products = "";

$product_sales = array_count_values($product_ids);
arsort($product_sales);
$i = 0;
foreach($product_sales as $sales){
    $i++;
    $product_id = array_search($sales,$product_sales);
    $top_selling_products .= $product_id.' x '.$sales.'<br />';
    if($i == 5){break;}
}

echo $top_selling_products;
?>

然而,它并不完全按照我的意愿行事,目前输出的内容如下:

58 x 3
118 x 2
118 x 2
54 x 1
54 x 1

它应该在哪里:

58 x 3
118 x 2
39 x 2
54 x 1
14 x 1

它使得数组中的最后一项具有相同的索引,因此当有两个或更多具有相同销售量的产品时,它不会将它们捡起来。

获得所有独特ID的最佳方法是什么。对此有任何帮助或帮助将不胜感激。

4 个答案:

答案 0 :(得分:2)

您已经拥有$product_sales所需的内容:

foreach($product_sales as $id => $count){
    $i++;
    $top_selling_products .= $id.' x '.$count.'<br />';
    if($i == 5){break;}
}

答案 1 :(得分:1)

您的代码可以简化为使用array_map()

之类的内容
arsort($product_sales);
$output = array_map(function($sales, $pid) {
    return $pid.' x '.$sales;
}, $product_sales, array_keys($product_sales));
echo implode('<br />', $output);

答案 2 :(得分:1)

<?php

$product_ids      = [58,58,68,39,4,118,14,54,39,118,58];
$product_sales    = array_count_values($product_ids);
arsort($product_sales);
$top_five_sellers = array_slice($product_sales, 0, 5, true);
foreach($top_five_sellers as $id => $count)
    echo $id.' x '.$count."\n";

输出:

58 x 3
39 x 2
118 x 2
68 x 1
4 x 1

答案 3 :(得分:0)

您可以通过使用array_count_values

保持密钥,使用foreach +简单arsort +排序数组来实现目标
$product_ids = [58,58,68,39,4,118,14,54,39,118,58];
$arr = array_slice(array_count_values($product_ids), 0, 5, true);
arsort($arr);
$str = "";
foreach($arr as $k=>$v)
  $str .= "$k X $v \n";
echo $str;

Live Demo

输出为:

58 X 3 
118 X 2 
39 X 2 
68 X 1 
4 X 1