Поиск и замена внутри ассоциативного массива - PullRequest
3 голосов
/ 22 августа 2011

Мне нужно искать и заменять внутри ассоциативного массива.

например:

$user = "user1"; // I've updated this

$myarray = array("user1" => "search1", "user2" => "search2", "user3" => "search1" ) ;

Я хочу заменить search1 на search4. Как мне этого добиться?

ОБНОВЛЕНИЕ: я забыл упомянуть, что массив имеет несколько значений search1, и я просто хочу изменить значение, где key is == $user. Извините, что не упомянул об этом раньше.

Ответы [ 10 ]

6 голосов
/ 22 августа 2011
$myarray = array("user1" => "search1", "user2" => "search2" );

foreach($myarray as $key => $val)
{
    if ($val == 'search1') $myarray[$key] = 'search4';
}
2 голосов
/ 22 августа 2011

Почему бы просто не сделать

if (isset($myarray[$user])) $myarray[$user] = 'search4';
2 голосов
/ 22 августа 2011
$user = "user1";
$myarray = array("user1" => "search1", "user2" => "search2", "user3" => "search1" );
foreach($myarray as $key => $val)
{
    if ($val == 'search1' and $key == $user )
    {
       $myarray[$key] = 'search4';
       break;
    }
}
print_r($myarray);

Отпечатки:

Array
(
    [user1] => search4
    [user2] => search2
    [user3] => search1
)
2 голосов
/ 22 августа 2011

Для этого есть функция: array_map () .

// Using a lamba function, PHP 5.3 required
$newarray = array_map(
    function($v) { if ($v == 'search1') $v = 'search4'; return $v; },
    $myarray
);

Если вы не хотите использовать лямбда-функцию, определите нормальную функцию или метод и вызовите ее.

0 голосов
/ 28 июня 2017

если вы хотите для определенного ключа, то вы просто добавляете условие для ключа в предыдущих и подобных.

$user = "user1";
$myarray = array("user1" => "search1", "user2" => "search2" );

foreach($myarray as $key => $val)
{
    if ($val == 'search1' && $key == $user) $myarray[$key] = 'search4';
}
0 голосов
/ 15 мая 2013

Поиск и замена внутри ассоциативного массива или числа. Значение замены в любом ассоциативном массиве и массиве может быть любым глубоким

function array_value_replace($maybe_array, $replace_from, $replace_to) {

    if (!empty($maybe_array)) {
        if (is_array($maybe_array)) {
            foreach ($maybe_array as $key => $value) {
                $maybe_array[$key] = array_value_replace($value, $replace_from, $replace_to);
            }
        } else {
            if(is_string($maybe_array)){
                $maybe_array = str_replace($replace_from, $replace_to, $maybe_array);
            }               
        }
    }

    return $maybe_array;
}
0 голосов
/ 22 августа 2011

Обновлено

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

$user    = 'user1';
$search  = 'search1';
$replace = 'search4';
$array   = array('user1' => 'search1', 'user2' => 'search2');

if (isset($array[$user]) && $search === $array[$user]) $array[$user] = $replace;

Похож на метод @ Джозефа (почти такой же), но с несколькими изменениями:

$user = 'user1';
$array = array("user1" => "search1", "user2" => "search2" );

foreach($array as $key => &$value) {
    if ($key === $user) {
        $value = 'search4';
        break; // Stop iterating after key has been found
    }
}

Передача по ссылке - лучший способ редактирования внутри foreach, и, возможно, быстрее.

0 голосов
/ 22 августа 2011
$originalArray = array( "user1" => "search1" , "user2" => "search2" );
$pattern = 'search1';
$replace = 'search4';

$replacedArray = preg_replace( '/'.$pattern.'/' , $replace , $originalArray );

Исправляет риск, упомянутый в комментарии в ответ на это решение

0 голосов
/ 22 августа 2011

Исходя из ответа Джозефа, использование preg_replace может позволить вам использовать код в других ситуациях:

function pregReplaceInArray($pattern,$replacement,$array) {
    foreach ($array as $key => $value) {
        $array[$key] = preg_replace($pattern,$replacement,$value);
    }   
    return $array;
}
0 голосов
/ 22 августа 2011

Использование str_replace должно работать:

$myarray = array("user1" => "search1", "user2" => "search2" ) ;

$newArray = str_replace('search1', 'search4', $myarray);
...