**Обновлено:
Я пытаюсь отобразить количество ключей в моих массивах, начинающихся с «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>";
Пожалуйста помоги?!
Откуда это вообще взялось ['group']
???
Да, хороший вопрос, извините. Я использовал фрагмент кода из существующего поста (который не совсем относился к моей проблеме), чтобы получить представление о том, как работает функция, и сейчас нахожусь в точке, где она работает, она есть, но не работает, если я ее удалю. Обычно я могу подобрать фрагменты того, как мне нужно его использовать, но этот поставил меня в тупик!
Извлеките минимальный воспроизводимый пример! Ваш вопрос на самом деле считается не по теме без него. Как новый пользователь здесь, также возьмите тур и прочитайте Как спросить.
Спасибо @UlrichEckhardt, я отредактировал соответственно. Надеюсь, теперь это имеет смысл!
Вы не можете использовать 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 для этого... ???? Как человек ??? Проверьте мой ответ.
@RakeshJakhar Перед редактированием OP предполагалось, что результат array_map даст окончательный результат ...
вы можете использовать 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!!
Что делать, если исходный массив не заполнен, например: Массив ([0] => P [1] => M [2] => [3] => [4] => ) Он все еще работает, но я получаю " array_count_values(): может подсчитывать только значения STRING и INTEGER!" Я могу ввести «-» в пустые поля моей базы данных, но тогда это испортит остальную часть моего кода. Можно ли добавить туда оператор if, чтобы проверить, являются ли ключи нулевыми или что-то в этом роде?
@PaulCullis использует array_filter() для удаления пустых элементов
Ты гений. Спасибо!
Функция 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
) в одной функции, отделяя эту часть от части итерации. Поскольку это позволяет избежать изменяемого состояния, это также можно рассматривать как функциональный (как в «функциональном программировании») подход.
Возможный дубликат Недопустимое смещение строки Предупреждение PHP