PHP - поиск уникальных значений в массиве - PullRequest
0 голосов
/ 08 июня 2018

Я создаю сайт электронной коммерции и пытаюсь получить список самых продаваемых продуктов.

В следующем примере показан массив идентификаторов продуктов из продаж и выводятся наиболее продаваемые продукты в виде'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

Он получает последний элемент в массиве с тем же индексом, поэтому, когда есть два или более товара с одинаковым объемом продаж, он не собирает их.

Каков наилучший способполучить все уникальные идентификаторы.Любая помощь или помощь с этим будет принята с благодарностью.

Ответы [ 4 ]

0 голосов
/ 08 июня 2018

Вы можете достичь своей цели, используя 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;

Демонстрация в реальном времени

Вывод:

58 X 3 
118 X 2 
39 X 2 
68 X 1 
4 X 1 
0 голосов
/ 08 июня 2018

Ваш код может быть упрощен, чтобы использовать что-то вроде 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);
0 голосов
/ 08 июня 2018
<?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
0 голосов
/ 08 июня 2018

У вас уже есть то, что вам нужно $product_sales:

foreach($product_sales as $id => $count){
    $i++;
    $top_selling_products .= $id.' x '.$count.'<br />';
    if($i == 5){break;}
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...