Использование str_replace в массиве - PullRequest
0 голосов
/ 22 октября 2011

У меня есть проблема, которую я не могу найти решение.В цикле foreach

foreach( $results->result as $item )

следующий код

$item->title = str_replace( " - Home", "", $item->title );

всегда выдает ошибку

Исправляемая фатальная ошибка : ОбъектКласс stdClass не может быть преобразован в строку

Я думал, str_replace смог обработать массивы?Что мне нужно изменить, чтобы это работало?

Спасибо за любой совет!

Ответы [ 3 ]

4 голосов
/ 22 октября 2011

Это не массив, это объект, , как говорится в ошибке ... Вы случайно не получили json_decode()?

Однако решение простое - приведите его к массиву:

$item->title = str_replace( " - Home", "", (array) $item->title );

Еще один момент, связанный с этим, заключается в том, что если вы хотите изменить данные, хранящиеся в $results->result, а не просто их копию, вам потребуется ваш foreach:

foreach( $results->result as &$item )

... и получить элемент в качестве ссылки, а не копию ...

2 голосов
/ 22 октября 2011

$item->title представляется объектом типа stdClass, а не строкой. Сделайте var_dump($item->title), чтобы увидеть, как выглядит объект.

Кроме того, ваш цикл не будет делать то, что вы ожидаете, после завершения цикла все объекты в $results->result будут по-прежнему иметь одинаковые значения (используйте foreach($results->result as &$item) (передача по ссылке))

2 голосов
/ 22 октября 2011

Сделайте var_dump на $item->title, потому что это не массив, это объект.str_replace может работать только с реальными массивами и строками.Если вы ожидаете, что это будет массив, то у вас могут возникнуть некоторые проблемы в другом месте, и я бы изучил это.

Если вы просто ищете патч, вы можете сойти с кастингаЭто.Если бы все остальное работало, я бы сделал это, потому что у него действительно было наименьшее количество побочных эффектов:

// convert it to an array before passing it through str_replace
// (array) $item->title
// then convert it back to its original form by casting the result back
// (object) str_replace
$item->title = (object) str_replace( " - Home", "", (array) $item->title );

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


Кстати - если вы планируете использовать $item->title внеЦикл, вы также должны убедиться, что вы используете ссылку для обновления самого элемента:

foreach($results->result as &$item)
{
     $item->title = (object) str_replace( " - Home", "", (array) $item->title );
}
...