Как уникализировать первые значения и посчитать сумму вторых значений в многомерном массиве?

FRIE

Новичок
Есть массив, состоит из 2 пар значений - слово+частота.
Слова могут повторяться, их нужно уникализировать и сложить их частоту.

Пример:
array(3) { [0]=> array(2)
{ ["lemma"]=> string(16) "СЛОВО1" ["frequency"]=> string(3) "11 " }
[1]=> array(2)
{ ["lemma"]=> string(4) "СЛОВО2" ["frequency"]=> int(76) }
[2]=> array(2)
{ ["lemma"]=> string(16) "СЛОВО1" ["frequency"]=> int(18) }

Что что должно получиться в конечном виде:
array(2) { [0]=> array(2)
{ ["lemma"]=> string(16) "СЛОВО1" ["frequency"]=> string(21) "11 " }
[1]=> array(2)
{ ["lemma"]=> string(4) "СЛОВО2" ["frequency"]=> int(76) }

Как это сделать?
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
массив, слово сделать ключиком, значением - частоту, дальше перебором с проверкой допиливать в нужные ключи нехватающие значения
 

FRIE

Новичок
массив, слово сделать ключиком, значением - частоту, дальше перебором с проверкой допиливать в нужные ключи нехватающие значения
Я уже часов 10 бьюсь, написал кучу кода с перебором массива, созданием нового и запиливанием туда суммы значений.
Даж выкладывать этот код сюда страшно )))
Может есть готовое решение? )
 

FRIE

Новичок
PHP:
/*$lemmas_w_freq тут массив с повторяющимися значениями такого вида

array(5) { [0]=> array(2) { [0]=> string(16) "СЛОВО1" [1]=> int(11) }
            [1]=> array(2) { [0]=> string(8) "СЛОВО2" [1]=> int(76) }
            [2]=> array(2) { [0]=> string(16) "СЛОВО1" [1]=> int(18) }
            [3]=> array(2) { [0]=> string(8) "СЛОВО2" [1]=> int(131) }
            [4]=> array(2) { [0]=> string(16) "СЛОВО1" [1]=> int(69) }
        }
*/

$c=count($lemmas_w_freq);
$lemmas_uniq_freq=[];
$unique_lemmas=array_unique($lemmas);// тут список уникальных слов
for ($x=0; $x<$c; $x++){
    if (in_array($lemmas_w_freq[$x][0], $unique_lemmas)) {
   
        $g=count($lemmas_uniq_freq);
       
        if($g!=0){
            for ($y=0; $y<$g; $y++){
                if ($lemmas_w_freq[$x][0]==$lemmas_uniq_freq[$y][0]) {
                    $lemmas_uniq_freq[$y][1]=$lemmas_uniq_freq[$y][1]+$lemmas_w_freq[$x][1];
                }
                else{
                    $lemmas_uniq_freq[$x]=array($lemmas_w_freq[$x][0],$lemmas_w_freq[$x][1]);
                }   
            }
        }
        else{
            $lemmas_uniq_freq[]=array($lemmas_w_freq[$x][0],$lemmas_w_freq[$x][1]);   
        }

    }
}

var_dump($lemmas_uniq_freq);
echo "<br><br><br>";
var_dump($lemmas_w_freq);

Вот код. В итоге он выдаёт почти такой же массив как и был до этого ((
 

hell0w0rd

Продвинутый новичок
PHP:
$lemmas = [];
foreach($uniqueLemmas as list($word, $frequency)) {
    if (!isset($lemmas[$word])) {
        $lemmas[$word] = $frequency;
    }
}
C твоим последним вариантом входного массива.
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
Мне нравится, в первом сообщении массив один, в примере с кодом он уже другой. Мутирует на глазах.
 

hell0w0rd

Продвинутый новичок
FRIE, иди читай ман по языку. код тебе разжевывать никто не будет
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
FRIE, у меня напрашиваются непечатные выражения, но я сдержусь. Ты исправил не то, что надо. Голову включи, подумай, что нужно сделать, чтобы получить результат.

У тебя есть массив. Ты по нему идешьв цикле, создаешь новый массив, где ключами будут слова, а значением будет величина frequency. Если нет ключа - ставим просто $arr[$word] = $frequency; Если такой ключ есть, то ты просто прибавляешь к нему новое значение.
 

hell0w0rd

Продвинутый новичок
c0dex, судя по ожидаемому результату не нужно ничего складывать, нужно первый вариант оставить.
 

hell0w0rd

Продвинутый новичок
c0dex, глянь в первый пост на данные и ожидаемый результат frequency
 

FRIE

Новичок
Почти получилось!

PHP:
foreach($lemmas_w_freq as list($word, $frequency)) {
  if (!isset($unique_lemmas[$word])) {
     $unique_lemmas[$word][0]=intval($frequency);
  }
   else{
     $unique_lemmas[$word][0]=$unique_lemmas[$word][0]+intval($frequency);
     
   }
}

$t=0;
foreach($unique_lemmas as $word) {
   var_dump($word);echo"<br>";
}
/*
string(8) "СЛОВО1"
string(8) "СЛОВО2"
string(4) "СЛОВО3"
string(12) "СЛОВО4"
array(1) { [0]=> int(10) }  // частота для слова1
array(1) { [0]=> int(10) } // частота для слова2
array(1) { [0]=> int(7) }  // частота для слова3
array(1) { [0]=> int(3) }  // частота для слова4
Только получается что ключ и значение в разных массивах, почему так, непонятно
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
hell0w0rd, в первом посте у него там массив кривой вообще.

FRIE, на кой фиг ты там еще [0] впилил в массиве?)
 

FRIE

Новичок
Мозги сплавились =)

Ура! всё получилось, но теперь проблемы с выводом

PHP:
foreach($lemmas_w_freq as list($word, $frequency)) {
    if (!isset($unique_lemmas[$word])) {
        $lemm[$word]=intval($frequency);
    }
    else{
        $lemm[$word]=$lemm[$word]+intval($frequency);
      
    }
}

foreach($lemm as  list($key,$value )) {
    echo $key." ".$value."<br>";
}


var_dump($lemm);
Не выводит ключи и значения. До этого были ромбики со знаками вопросов, что то с кодировкой..
 
Сверху