массив массивов с str_replace - PullRequest
23 голосов
/ 03 июня 2011

Можно ли использовать array_map в сочетании с str_replace без вызова другой функции для выполнения str_replace?

Например:array_map(str_replace(' ', '-', XXXXX), $myArr);

Ответы [ 4 ]

56 голосов
/ 03 июня 2011

Нет необходимости для array_map. Из docs : «Если субъект - это массив, то поиск и замена выполняются с каждой записью субъекта, а возвращаемое значение также является массивом».

11 голосов
/ 03 июня 2011

Нет, это невозможно. Хотя, если вы используете 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
)
5 голосов
/ 03 июня 2011

Конечно, это возможно, вам просто нужно дать 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)
);

Но для конкретного примера в вопросе, как сказал chiborg , в этом нет необходимости. str_replace() будет рад работать с массивом строк.

str_replace(' ', '-', $myArr);
1 голос
/ 20 сентября 2012

Может быть важно отметить, что если массив, используемый в 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;
}
...