array_filter () не работает должным образом

Возможно, мне не хватает некоторых основ здесь. У меня есть массив и фильтрация значений с помощью функции array_filter (). Я использовал echo в функции фильтра, чтобы увидеть, работает ли отфильтрованное значение или нет.

<?php

$columns = array(
0 => 'ISO',
1 => 'Country',
2 => 'Country Code',
3 => 'Type of number',
4 => 'Voice Enabled',
5 => 'SMS Enabled',
6 => 'MMS Enabled',
7 => 'Domestic Voice Only',
8 => 'Domestic SMS only',
9 => 'Price /num/month',
10 => 'Inbound Voice price/min',
11 =>  'Inbound SMS price/msg ',
12 =>  'Inbound MMS price/msg ',
13 => 'Beta Status',
14 => 'Address Required',
);

echo '<pre>';
$columns = array_filter($columns, '_filter_column_names');
echo '</pre>';

function _filter_column_names($column_name){
$column_name = str_replace(' /', '_', $column_name);
$column_name = strtolower(str_replace(array(' ', '/'), '_', trim($column_name)));

echo $column_name.'<br>';
return $column_name;
}

echo '<pre>';
print_r($columns);
echo '</pre>';

Результат

iso
country
country_code
type_of_number
voice_enabled
sms_enabled
mms_enabled
domestic_voice_only
domestic_sms_only
price_num_month
inbound_voice_price_min
inbound_sms_price_msg
inbound_mms_price_msg
beta_status
address_required

Array
(
[0] => ISO
[1] => Country
[2] => Country Code
[3] => Type of number
[4] => Voice Enabled
[5] => SMS Enabled
[6] => MMS Enabled
[7] => Domestic Voice Only
[8] => Domestic SMS only
[9] => Price /num/month
[10] => Inbound Voice price/min
[11] => Inbound SMS price/msg
[12] => Inbound MMS price/msg
[13] => Beta Status
[14] => Address Required
)

Результирующий отфильтрованный массив не фильтруется вообще. Хотя кажется, что значения массива внутри функции фильтра фильтруются правильно. Вы также можете увидеть это в прямом эфире здесь http://3v4l.org/SttJ3

1

Решение

Я думаю, что вы не поняли, что array_filter делает. Как сказано в документации, он «фильтрует элементы массива с помощью функции обратного вызова», что означает, что обратный вызов должен возвращать true / false в зависимости от того, должен ли он быть включен или нет.

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

3

Другие решения

Вы не используете обратный вызов должным образом, в соответствии с PHP официальное руководство:

Итерирует по каждому значению в массиве, передавая их обратному вызову
функция. Если функция обратного вызова возвращает true, текущее значение
из массива возвращается в массив результатов.

Ваш обратный вызов должен возвращать FALSE для элементов, которые вам не нужны в выходном массиве.

0

По вопросам рекламы [email protected]