2013-04-15 7 views
-3

У меня есть массив как это:str_replace() не работает с массивом

array(46) 
{ 
[0]=> array(4) { ["category"]=> string(21) "Media/news/publishing" ["name"]=> string(20) "Cosmopolitan Armenia" ["id"]=> string(15) "146307748762264" ["created_time"]=> string(24) "2013-03-20T14:40:43+0000" } 
[1]=> array(4) { ["category"]=> string(17) "Telecommunication" ["name"]=> string(5) "Zangi" ["id"]=> string(15) "386291674718829" ["created_time"]=> string(24) "2013-03-20T11:07:46+0000" } 
[2]=> array(4) { ["category"]=> string(13) "Musician/band" ["name"]=> string(11) "Ray Charles" ["id"]=> string(12) "430894850091" ["created_time"]=> string(24) "2013-03-16T22:03:46+0000" } [3]=> array(4) { ["category"]=> string(4) "Cars" ["name"]=> string(13) "I'm In Like With You" ["id"]=> string(15) "447042531989769" ["created_time"]=> string(24) "2013-03-16T22:01:46+0000" } ....... 
} 

Кто-нибудь есть идея, почему этот код:

str_replace("'","\'",MY_ARRAY); 

... не заменяет ' в "I'm In Like With You"?

ответ

0

Вы не можете заменить непосредственно в массиве. вы можете использовать массивы как «найти это» и «заменить» текстом, но то, что вы используете, должно быть простой строкой.

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

foreach($array as $key => $element) { 
    $array[$key] = str_replace(..., ..., $element); 
} 

Учитывая вы несколько отдельных строк в массиве, вам придется работать на каждом :

$array[$key]['name'] = str_replace(....,...., $element); 
1

Использование str_replace, вы должны были бы петлю через массив и сделать str_replace на каждом из значений.

Например что-то вроде этого:

foreach($yourArray as $key => $value) 
{ 
    $yourArray[ $key ]['name'] = str_replace("'", "\'", $value); 
} 

Подробнее о «Foreach» here

2

Предполагая, что вы хотите, чтобы избежать всех элементов массива рекурсивно ... ваш код не может работать; str_replace() заменяется просто строкой. Вы можете использовать array_walk() эффективно это сделать:

В PHP 5.3 и выше (с поддержкой anonymous functions):

array_walk($data, function(&$item, $key){ 
    array_walk($item, function(&$item, $key){ 
     $item = str_replace("'","\'", $item); 
    }); 
}); 

Или используйте foreach loop:

foreach($data as &$v1){ 
    foreach($v1 as &$v2){ 
     $v2 = str_replace("'","\'", $v2); 
    } 
} 

Но все-таки, у меня что вам нужно это для ускорения данных для запроса MySQL, и вы должны использовать функцию, например mysqli_real_escape_string, mysql_real_escape_string, PDO::quote() или просто placeholders in prepared statement.

+0

Из документации PHP: «Если объектом является массив, то поиск и замена выполняются с каждой записью объекта, а возвращаемое значение также является массивом». – Gavin

0

Вы можете попробовать эту простую рекурсивную функцию

Пример

$object = new stdClass(); 
$object->game = "GOW'4"; 
$object->whoami = "Peehaa'"; 

$array = array(
     "nice'kkk", 
     "Fish" => array(
       "X" => "one'one", 
       "obj" => $object 
     ) 
); 

print_r(str_replace_recursive("'", "*", $array)); 

Выход

Array 
(
    [0] => nice*kkk 
    [Fish] => Array 
     (
      [X] => one*one 
      [obj] => stdClass Object 
       (
        [game] => GOW*4 
        [whoami] => Peehaa* 
       ) 

     ) 

) 

Функция Используется

function str_replace_recursive($search, $replace, $subject) { 
    $result = null; 
    if (is_array($subject)) { 
     $result = array(); 
     foreach ($subject as $k => $var) { 
      $result[$k] = str_replace_recursive($search, $replace, $var); 
     } 
    } elseif (is_object($subject)) { 
     $result = clone $subject; 
     foreach ($subject as $k => $var) { 
      $result->{$k} = str_replace_recursive($search, $replace, $var); 
     } 
    } else { 
     $result = str_replace($search, $replace, $subject); 
    } 

    return $result; 
} 
0

вы можете цикл внутри вашей array, а затем использовать $data однако вам нужно

$array = array(array('category' => 'Media/news/publishing', 
      'name' => 'Cosmopolitan Armenia' , 
      'id' => '146307748762264', 
      'created_time' => '2013-03-20T14:40:43+0000'), 
array( 
      'category' => 'Telecommunication', 
      'name' => 'Zangi', 
      'id' => '386291674718829', 
      'created_time' => '2013-03-20T11:07:46+0000'), 
array( 
      'category' => 'Musician/band', 
      'name' => 'Ray Charles', 
      'id' => '430894850091', 
      'created_time' => '2013-03-16T22:03:46+0000'), 
array( 
      'category' => 'Cars' , 
      'name' => 'I'm In Like With You', 
      'id' => '447042531989769', 
      'created_time' => '2013-03-16T22:01:46+0000') 
); 

foreach($array as $arr) 
{ 
    $data = str_replace('\'', '\\\'', $arr); 
    echo $data['name'] . '<br>'; 
} 

это Выведет

Cosmopolitan Armenia 
Zangi 
Ray Charles 
I\'m In Like With You 

вы можете изменить str_replace функцию как ваши потребности вы должны просто изменить второй параметр

Смежные вопросы