Intereting Posts
Debian Jessie – Apache2 / PHP 5.6, не может загружать более 128 КБ Электронная почта PDF-приложение с PHP с использованием FPDF Сортировка результата поиска MySQL с приоритетом Google App Engine PHP Routing – Query Params Как получить алгоритм подписи из сертификата? получать записи о Сан-Франциско при поиске «SanF» в mysql Почему это почтовое сообщение не декодируется правильно? Обновление PHP в XAMPP для Linux? Неустранимая ошибка: вызов функции-члена close () для не-объекта. Проблемы с MySQLi Baffled: PHP Неустранимая ошибка: Исключение брошено без рамки стека в Unknown в строке 0? Ошибка Sagepay 5068: метод шифрования не поддерживается (обновить с 2.22 до 3.00) Laravel-Core: Почему Laravel сохраняет псевдонимы несколько раз? Проблема с синтаксической ошибкой Bootstrap Кнопка загрузки состояния загрузки JQuery, как заставить другие состояния делать то же самое Неустранимая ошибка: вызов функции-члена execute () в boolean

Обновление многомерного массива в PHP

У меня есть массив, который выглядит так

$array = Array ( [0] => Array ( [Product] => Amazing Widget [Value] => 200 ) [1] => Array ( [Product] => Super Amazing Widget [Value] => 400 ) [2] => Array ( [Product] => Promising Widget [Value] => 300 ) [3] => Array ( [Product] => Superb Widget [Value] => 400 ) } 

Я хочу обновить массив, чтобы изменить «Перспективный виджет» на 800 вместо 300.

Обратите внимание, что порядок этого массива произволен, что означает, что мне нужно обновить значение, основанное на значении имени продукта (не на его номере в массиве).

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

Спасибо за любую помощь.

 foreach($array as &$value){ if($value['Product'] === 'Promising Widget'){ $value['Value'] = 800; break; // Stop the loop after we've found the item } } 

Итак, вы перебираете массив, находите нужное значение, а затем меняете его. Значение &$value так массива передается по ссылке. Это означает, что мы можем непосредственно редактировать значения в массиве из цикла, не выполняя $array[$key]['Value'] .

Я думаю, вам придется перебирать их, что-то вроде:

 foreach ($array as $k => $v) { if ($v['Product']=='Promising Widget') { $array[$k]['Value']=800; } } 

Я считаю, что наиболее универсальный подход заключается в использовании функции array_walk_recursive :

 array_walk_recursive($array, 'updateValue'); function updateValue(&$data, $key) { if($key == 'Promising Widget') { $data = 800; } } 

Таким образом, даже если вы измените свой массив позже, эта функция будет работать нормально.

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

 function r_search_and_replace( &$arr ) { foreach ( $arr as $idx => $_ ) { if( is_array( $_ ) ) r_search_and_replace( $arr[$idx] ); else { if( is_string( $_ ) ) $arr[$idx] = str_replace( "PATTERN", "REPLACEMENT", $_ ); } } }