Я не могу понять эту проблему с array_map, которая у меня возникла

**Обновлено:

Я пытаюсь отобразить количество ключей в моих массивах, начинающихся с «P», «M» и «D». Я думаю, что мне следует использовать array_maps и мне повезло с этим, но теперь я застрял и безуспешно пытался просмотреть руководство, здесь и w3schools.


Я использую PHP версии 5.6.36 с XAMPP на локальном сервере. Я пробовал играть с array_maps, который я считаю правильной командой для использования, но я просто не могу понять, как правильно его использовать. Я прочитал руководство по нему, посмотрел здесь, посмотрел на YouTube и W3Schools без везения. Кто-нибудь может помочь, пожалуйста?

У меня есть этот массив:

$tasks = array
(
    0 => 'P1',
    1 => 'M1',
    2 => 'D1',
    3 => 'P2',
    4 => 'D2'
);

Я хочу, чтобы он отображал это:

Array
(
    [P] => 2
    [M] => 1
    [D] => 2
)

Видите, как красиво и аккуратно он возвращает количество букв P, M и D?

Насколько я понимаю, код решения должен быть примерно таким:

$array2 = array_map(function(???????){
    return ??????????;
}, $tasks);

$array2a = (array_count_values($array2));

echo "<pre>"; print_r($array2a); echo "</pre>";

Пожалуйста помоги?!

Возможный дубликат Недопустимое смещение строки Предупреждение PHP

Alon Eitan 08.04.2019 18:48

Откуда это вообще взялось ['group']???

AbraCadaver 08.04.2019 18:53

Да, хороший вопрос, извините. Я использовал фрагмент кода из существующего поста (который не совсем относился к моей проблеме), чтобы получить представление о том, как работает функция, и сейчас нахожусь в точке, где она работает, она есть, но не работает, если я ее удалю. Обычно я могу подобрать фрагменты того, как мне нужно его использовать, но этот поставил меня в тупик!

Paul Cullis 08.04.2019 19:36

Извлеките минимальный воспроизводимый пример! Ваш вопрос на самом деле считается не по теме без него. Как новый пользователь здесь, также возьмите тур и прочитайте Как спросить.

Ulrich Eckhardt 08.04.2019 20:06

Спасибо @UlrichEckhardt, я отредактировал соответственно. Надеюсь, теперь это имеет смысл!

Paul Cullis 09.04.2019 09:47
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
5
81
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Вы не можете использовать array_map для этого... Вы могли бы использовать сокращение, я думаю, но вот быстрый и простой способ... В основном вы создаете свой новый массив и выполняете подсчет в соответствии с первой буквой вашего массива задач.

$list = new Array();
foreach($tasks as $task){
    if ($list[$task{0}]){
        $list[$task{0}]++;
    }else{
        $list[$task{0}] = 1;
    }
}

Проблема, с которой вы столкнетесь с array_map, заключается в том, что он всегда будет давать соотношение 1: 1 вашего массива, а это не то, что вам нужно...

(извините за плохой PHP, если это так, было много лет...)

Обновлено:

Используя ваш отредактированный вопрос, вот ваше возможное использование:

$array2 = array_map(function($val){
    return $val{0};
}, $tasks);

Ключом к обоим ответам является часть $var{0}, которая извлекает символ с индексом 0...

Вы не можете использовать array_map для этого... ???? Как человек ??? Проверьте мой ответ.

Rakesh Jakhar 09.04.2019 10:03

@RakeshJakhar Перед редактированием OP предполагалось, что результат array_map даст окончательный результат ...

Salketer 09.04.2019 11:19
Ответ принят как подходящий

вы можете использовать array_map следующим образом:

$tasks = array
(
  0 => 'P1',
  1 => 'M1',
  2 => 'D1',
  3 => 'P2',
  4 => 'D2'
);
$charsToCheck = array('P','M','D');

$result = array_map(function($v) use ($charsToCheck){
if (in_array(substr( $v, 0, 1),$charsToCheck))
    return substr( $v, 0, 1);
}, $tasks);
print_r(array_count_values($result));

Результат:-

Array
(
 [P] => 2
 [M] => 1
 [D] => 2
) 

Идеально! Большое спасибо @Rakesh Jakhar!!

Paul Cullis 09.04.2019 10:35

Что делать, если исходный массив не заполнен, например: Массив ([0] => P [1] => M [2] => [3] => [4] => ) Он все еще работает, но я получаю " array_count_values(): может подсчитывать только значения STRING и INTEGER!" Я могу ввести «-» в пустые поля моей базы данных, но тогда это испортит остальную часть моего кода. Можно ли добавить туда оператор if, чтобы проверить, являются ли ключи нулевыми или что-то в этом роде?

Paul Cullis 09.04.2019 11:43

@PaulCullis использует array_filter() для удаления пустых элементов

Rakesh Jakhar 09.04.2019 11:44

Ты гений. Спасибо!

Paul Cullis 09.04.2019 11:47

Функция array_map() создает один выходной элемент из каждого входного элемента. Поскольку вы этого не хотите, это неправильный инструмент. Вероятно, самый простой способ достичь своей цели — использовать простой цикл. Однако, если все усложнится, это может плохо масштабироваться. В таких случаях может пригодиться array_reduce():

$input = [
    0 => 'P1',
    1 => 'M1',
    2 => 'D1',
    3 => 'P2',
    4 => 'D2',
];

$frequency = array_reduce(
    $input,
    function ($carry, $item) {
        $initial = substr($item, 0, 1);
        if (array_key_exists($initial, $carry)) {
            $carry[$initial] += 1;
        }
        return $carry;
    },
    [
        'P' => 0,
        'M' => 0,
        'D' => 0,
    ]
);

echo json_encode($frequency, JSON_PRETTY_PRINT) . PHP_EOL;

Смысл этого в том, что он определяет, что делать с одним элементом ($item) и как изменить результирующее состояние ($carry) в одной функции, отделяя эту часть от части итерации. Поскольку это позволяет избежать изменяемого состояния, это также можно рассматривать как функциональный (как в «функциональном программировании») подход.

Другие вопросы по теме