Массив массивов с str_replace
Можно ли использовать array_map
в сочетании с str_replace
без вызова другой функции, чтобы сделать str_replace
?
Например:array_map(str_replace(' ', '-', XXXXX), $myArr);
4 ответа
Там нет необходимости для array_map. Из документов: "Если тема - это массив, то поиск и замена выполняются для каждой записи темы, а возвращаемое значение также является массивом".
Нет, это невозможно. Хотя, если вы используете PHP 5.3, вы можете сделать что-то вроде этого:
$data = array('foo bar baz');
$data = array_map(function($value) { return str_replace('bar', 'xxx', $value); }, $data);
print_r($data);
Выход:
Array
(
[0] => foo xxx baz
)
Конечно, это возможно, вы просто должны дать array_map()
правильный ввод для функции обратного вызова.
array_map(
'str_replace', // callback function (str_replace)
array_fill(0, $num, ' '), // first argument ($search)
array_fill(0, $num, '-'), // second argument ($replace)
$myArr // third argument ($subject)
);
Но для конкретного примера в вопросе, как сказал Чиборг, в этом нет необходимости. str_replace()
с удовольствием поработает над массивом строк.
str_replace(' ', '-', $myArr);
Может быть важно отметить, что если массив, используемый в str_replace, является многомерным, str_replace не будет работать.
Хотя это не дает прямого ответа на вопрос об использовании array_map без вызова дополнительной функции, эта функция все еще может быть полезна вместо 'str_replace' в первом параметре array_map, если вы решите, что вам нужно использовать array_map и замену строк в нескольких размерные массивы. Он ведет себя так же, как и при использовании str_replace:
function md_str_replace($find, $replace, $array) {
/* Same result as using str_replace on an array, but does so recursively for multi-dimensional arrays */
if (!is_array($array)) {
/* Used ireplace so that searches can be case insensitive */
return str_ireplace($find, $replace, $array);
}
$newArray = array();
foreach ($array as $key => $value) {
$newArray[$key] = md_str_replace($find, $replace, $value);
}
return $newArray;
}