Вопрос по duplicates, arrays, associative, php – Ищите повторяющиеся значения в ассоциативном массиве и добавляйте их в счетчик

4

Привет я пытаюсь подсчитать количество повторяющихся значений в ассоциативном массиве, который выглядит следующим образом:

array(3) { [0]=> array(3) { ["Title"]=> string(25) "hello" 
                            ["Price"]=> int(50) 
                            ["Count"]=> int(1) }
           [1]=> array(3) { ["Title"]=> string(35) "world" 
                            ["Price"]=> int(50) 
                            ["Count"]=> int(1) } 
           [2]=> array(3) { ["Title"]=> string(25) "hello" 
                            ["Price"]=> int(50) 
                            ["Count"]=> int(1) } } 

Как вы можете видеть здесь, в поле «Заголовок» есть повторяющееся значение. Я хочу посчитать их и добавить один к & quot; Count & quot; часть. Я начал делать что-то вроде этого:

$prodArray = array();

// Add the values to the array if it's the first time it occurs.
if (!in_array($row['prodTitle'], $prodArray["Title"]))
{
array_push($prodArray, 
           array( Title => $row['prodTitle'],
                  Price => $row['prodPrice'],
                  Count => 1)
          );
}
else
{
//Add one to the count for the current item.
}   

дело в том, что я не могу получить доступ к "Заголовку" элемент в массиве через функцию in_array. Любые предложения приветствуются.

Ну, я вообще не эксперт, но вы знаете, что есть функции, которые это делают, и не нужно ничего изобретать. Вот ссылка на эти функцииphp.net/manual/en/array.sorting.php iaintunderstand
У вас есть пример того, как это будет выглядеть? user1593846
хорошо, я прошел через некоторые из этих функций, и я нашел что-то, что могло бы быть полезным, это выглядело как первый пример по этой ссылке, я просто не понимаю код полностью, поэтому буду признателен, если кто-нибудь сможет объяснить функцию для меня.php.net/manual/en/function.uksort.php user1593846
отсортировать их и затем запустить цикл foreach, сравнивая один с первым и добавляя 1 к счетчику каждый раз, когда он равен? iaintunderstand

test

Ваш Ответ

2   ответа
1

который вы создаете, что-то вроде этого избегайте необходимости проходить массив несколько раз:

$arr=array();
while($row = mysql_fetch_array($result))  {                  
  $arr[$row['prodTitle']] = isset($arr[$row['prodTitle']]) 
                               ? $arr[$row['prodTitle']] +1 
                               : 0;                    
}
$dups = array_keys(array_filter($arr)); //any key => 0 will be filtred out

Если вы хотите получить результаты напрямую с помощью SQL, взгляните на это:

Ваш текущий запрос--

SELECT prodTitle 
  FROM product 
WHERE prodTitle != '{$keyword}' 
  AND creditCard IN( SELECT creditCard FROM product WHERE prodTitle ='{$keyword}');

которые дали данные, как это

prod cc
A    1
A    2
A    3
A    1
A    1
B    15
B    1
B    2
B    21
C    10
C    1

возвращает этот набор (с ключевым словом $ == 'a';):

prod 
B
B
C

Совокупный запрос, который возвращаетonly записи, в которых кредитные карты, использованные не на X, также использовались на X, по крайней мере, дважды -

SELECT p1.prodTitle, COUNT(p2.creditCard) AS numrecords
  FROM product p1
    JOIN product p2
    ON (p1.creditCard = p2.creditCard)
WHERE p1.prodTitle != '{$keyword}'
  AND p2.prodTitle = '{$keyword}'
GROUP BY p1.prodTitle 
  HAVING COUNT(p2.creditCard) > 1;

учитывая те же данные, возвращает этот набор:

prod  num
B    2

Выполнение агрегированного запроса позволяет избежать всех проблем с циклами. Вот этоссылка на сайт в список MySQL агрегатных функций.

Большое спасибо за это решение, запрос был именно то, что мне нужно, большие пальцы вверх. user1593846
1

я нашел свое решение и заставил его выглядеть примерно так, возможно, он не самый эффективный способ, но он работает:

$prodArray = array();
$ar = array();


$query ="THE QUERY";
$result = mysql_query($query) or die(mysql_error());

while($row = mysql_fetch_array($result))
{
array_push($ar, $row['prodTitle']);
}

function findDuplicates($data,$dupval) {
$nb= 0;
foreach($data as $key => $val)
if ($val==$dupval) $nb++;
return $nb;
}


$uniarr = array_unique($ar);

//Will run the function findDuplicates for each unique title in the array
for ($i = 0; $i < sizeof($uniarr); $i++)
{
$count = findDuplicates($ar, $uniarr[$i]);
array_push($prodArray, array( Title => $uniarr[$i], Count => $count));
}

//Displays 2 of the results in the array
for ($c = 0; $c < 2; $c++)
{
echo "The title:".$prodArray[$c]["Title"]." And the amount:".$prodArray[$c]["Count"];
echo "<br />";
}

Поэтому вы можете оставлять свои комментарии по этому вопросу, и если у вас есть какие-либо улучшения, не стесняйтесь их публиковать.

поскольку вы выполняете запрос, почему бы не найти дубликаты в запросе, а не пытаться найти их в результирующем массиве?
Я не очень хорош в SQL, поэтому я не уверен, как подсчитать количество дубликатов и добавить количество и заголовок в массив в существующем запросе, который я получил. Запрос выглядит так: $ query = & quot; SELECT prodTitle ИЗ продукта WHERE prodTitle! = & Apos; {$ keyword} & apos; AND creditCard IN (ВЫБЕРИТЕ creditCard ИЗ ПРОДУКТА, ГДЕ prodTitle = & quot; {$ ключевое слово} & quot;) & quot ;; user1593846

Похожие вопросы