Алексей Владимирович

Кажется, должно так работать, ан нет.

$result = reduce_left($array, function($item, $index, $collection, $acc){
            if (!array_key_exists($item, $acc)){
                return $acc[$item] = 0;
            }
            else{
                return $acc[$item]++;
            }
            return $acc;
    }, []);
    return $result;

Не понял почему. Вот это из решения

        $acc[$item]++;
        return $acc;

что делает? Сначала мы создаём массив с ключами и нулевыми(единичными значениями). Когда доходим до первого повторяющегося ключа, то записываем в него значение на 1 больше, то есть в первый повтор значение будет 1? ... А нам-то нужны в неповторяющийся проход 1, а потом +1...

5 0

Так, если в моём решении убрать пару ретёнов, то тест проходит. Блин, зря в решение подсмотрел ; (

1

Но вопрос про решение учителя остался. Почему оно проходит тест?

0

            if (!array_key_exists($item, $acc)){
                return $acc[$item] = 0;

вот тут '$acc[$item] = 1' должно быть, т.е. если этого значения в аккумуляторе не существует, то добавляем его со значением 1, т.к. это первый раз, если же это значение в аккумуляторе существует то мы увеличиваем его на один. потом после прохода массива возвращаем аккумулятор.

0

В решении учителя как раз 0.

0

вот мое решение:

function wordsCount ($array) 
{
    return reduce_left($array, function ($item, $index, $collection, $acc) {
        if (!array_key_exists($item, $acc)) {
        $acc[$item] = 1;
      } else {
        $acc[$item]++;
      }
      return $acc;
    }, []);
}

Просто в решении учителя, если этого значения не существует в аккумуляторе то создается ключ со значением 0, и после этого к этому значению прибавляется 1, и это прибавление не в рамках if, а после выполнения if. И если if не удовлетворяется, то программа просто переходит к следующей процедуре. Короче все дело в том что у учителя инкремент значения выполняется в любом случае.

1

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

Вячеслав Саленок 04 сентября 2017 →

Почему arrayreduce работает медленнее чем foreach, у меня была такая задачка нужно было из массива имен пол...

Дмитрий Добренький 23 мая 2017 →

Правильно ли я понял - array_reduce самостоятельно выбирает из полученного массива данные и передает в функ...

Иван Синевич 11 апреля 2017 →

// removed Почему не работает вот этот код? 1) App\SolutionTest::testWordsCount with data set #0 (array(), ...

Vitaly Davydov 29 июня 2016 →

Глупый вопрос, но зачем нужны эти $index, $collection, если я не использую их в коде?

Юрий Ульянов 06 мая 2016 →

Выдает вот такое: 1) App\TestSolution::testWordsCount with data set #1 (array(1, 1, 2), array('cat', 'dog',...

Мы учим программированию с нуля до стажировки и работы. Попробуйте наш бесплатный курс «Введение в программирование» или полные программы обучения по Node, PHP, Python и Java.

Хекслет

Подробнее о том, почему наше обучение работает →