2014-05-21 4 views
2

у меня есть это:Замена значения в ассоциативном массиве?

foreach ($books as $book) 
{ 
    $catname = get_category_name($book['category']); 
    $book['category'] = $catname; 
} 
print_r($books); 

Сейчас $book['category'] представляет собой целое значение, которое ссылается на идентификатор строки в таблице категорий в базе данных (например, ID = 1) фантастики. Как вы можете догадаться, get_category_name($id) берет идентификатор и находит правильную строку и возвращает название категории. Функция работает правильно, и если i print_r($catname) в foreach печатает названия категорий, как и следовало ожидать.

У меня есть ассоциативный массив с именем $books, который заполняется из каждой строки в таблице книг в базе данных. То, что я хочу сделать, - принять целочисленное значение категории каждого элемента книги и использовать get_category_name($id), чтобы заменить это целочисленное значение на фактическое имя категории.

Проблема, с которой я сталкиваюсь, заключается в том, что я не могу заменить целочисленное значение, которое уже существует в $book['category'], с фактическим именем категории, которое находится в $catname. Когда я использую print_r($books), чтобы узнать, были ли внесены изменения в foreach, они подтверждают, что изменения не производятся.

Как это исправить?

ответ

3

Я думаю, вы хотите что-то подобное?

foreach ($books as &$book) 
{ 
    $catname = get_category_name($book['category']); 
    $book['category'] = $catname; 
} 
print_r($books); 

Обратите внимание: & $ book.

+0

Благодарю вас. Сейчас он работает! –

+0

+1 Использование по ссылке :-) – Darren

2

Вы либо используете foreach($books as &$book) и редактируете $book. Таким образом, у вас есть ссылка на элемент реальной книги внутри массива вместо его копии. Помните, что если вы хотите сделать это несколько раз в одном массиве, вам нужно будет каждый раз перезагружать массив после использования. См .: http://nl1.php.net/reset

Или вы используете foreach($books as $key=>$value) и редактируете $books[$key]. Таким образом, вы получаете копии книг и их ключей. Но затем вы используете ключ в исходном массиве.

0

Проблема в том, что на самом деле вы не меняете $books, но $book, вот почему вы не видите изменений в $books. Возможное решение:

foreach ($books as $booksId => $book) //$booksId will contain current index in $books 
{ 
    $catname = get_category_name($book['category']); 
// now you can change correct index in $books: 
    $books[$booksId]['category'] = $catname; 
} 

Редактировать: @ Cardinal решение с повторением также является правильным.

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