PHP - Редактирование нескольких значений массива (если они существуют) - PullRequest
1 голос
/ 05 ноября 2008

У меня есть многомерный массив. Мне нужно выполнить поиск определенного диапазона значений, отредактировать эти значения и вернуть отредактированные данные.

Пример массива:

array(3) {
  ["first"]=>
  array(1) {
    [0]=>
    string(4) "baz1"
  }
  ["second"]=>
  array(1) {
    [0]=>
    string(4) "foo1"
  }
  ["third"]=>
  array(1) {
    [0]=>
    string(4) "foo2"
  }

Теперь я хочу найти любые значения, которые соответствуют foo (foo1 и foo2 в массиве примеров), вставить в них «-bar» (foo-bar1, foo-bar2) и вернуть это значение. Каковы наилучшие способы приблизиться к этому?

РЕДАКТИРОВАТЬ Я должен был упомянуть, что foo может на самом деле быть чем угодно (например, examplefoo1, somethingelsefoo2, blahblahfoo3) Я думаю, что это исключает str_replace.

Ответы [ 4 ]

7 голосов
/ 05 ноября 2008

Если ваш массив не будет очень глубоким, это может сработать. ($ массив - это то, что вы хотите заменить позже своим)

$array= array('first' => array('bazi1'), 'second' => array('foo1'), 'third' => array('foo2') );
function modify_foo(&$item, $key)
{
   $item = str_replace('foo', 'foo-bar', $item);
}
array_walk_recursive( $array, 'modify_foo' );

Если вы хотите, чтобы foo заменялось даже в нечто elsefoo2, тогда str_replace будет в порядке.

5 голосов
/ 05 ноября 2008

Как насчет этого:

function addDashBar($arr)
{
    foreach ($arr as $key => $value)
    {
       if (is_array($value))
           $arr[$key] = addDashBar($value)
       else
       {
           $arr[$key] = str_replace($value, "foo", "foo-bar");
       }
    }

    return $arr;
}
1 голос
/ 06 ноября 2008

Если у вас есть одномерный массив, вы можете использовать array_map ();

** Edit: у меня был некоторый код здесь, но после тестирования он не работает.

Что касается вашего редактирования. То, что Foo находится в конце строки, не означает, что str_replace больше не будет работать.

echo str_replace("foo","foo-bar","mycrazystringwithfoorightinthemiddleofit");

все равно вернется

mycrazystringwithfoo-barrightinthemiddleofit

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

Функция array_recursive_walk (). здесь Надеюсь, это поможет.

1 голос
/ 05 ноября 2008
 function test_replace1(&$input, $search, $replace) {
    $result = array();
    $numReplacements = 0;
    foreach ($input as &$value) {
        if (is_array($value)) {
            $result = array_merge($result, test_replace1($value, $search, $replace));
        } else {
            $value = str_replace($search, $replace, $value, $numReplacements);
            if ($numReplacements) {
                $result[] = $value;
            }
        }
    }
    return $result;
 }

 $changed_values = test_replace1($arr, 'foo', 'foo-bar');
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...