简体   繁体   English

PHP - 在数组中查找唯一值

[英]PHP - finding unique values within an array

I am creating an ecommerce site and am trying to get a list of top selling products.我正在创建一个电子商务网站,并试图获取最畅销产品的列表。

The following example shows an array of product ids from sales, and is outputting the top selling products in the form of 'product id' x 'number of sales'以下示例显示了来自销售的一系列产品 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;
?>

However, it's not exactly doing what I want, at present this is outputting the following:但是,它并没有完全按照我的意愿行事,目前正在输出以下内容:

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

Where it should be:应该在哪里:

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

It is getting the last item in the array with the same index so when there are two or more products with the same amount of sales it is not picking them up.它以相同的索引获取数组中的最后一项,因此当有两个或多个具有相同销售额的产品时,它不会提取它们。

What would be the best way to get all unique ids?获得所有唯一 ID 的最佳方法是什么?

You already have what you need in $product_sales :您已经在$product_sales获得了所需的东西:

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

Your code can be simplified to use something like array_map() :您的代码可以简化为使用类似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);
<?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";

Output:输出:

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

You can achieve your goal by using array_count_values + Simple foreach + Sort array by Keeping key with arsort你可以通过使用array_count_values + Simple foreach + Sort array by Keeping key with 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现场演示

Output is as :输出为:

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM