Когда я var_dump на переменной с именем $ tags (многомерный массив), я получаю следующее:
массив ( [0] => Массив ( [name] => tabbing [url] => tabbing ) [1] => Массив ( [имя] => tabby ridiman [url] => tabby-ridiman ) [2] => Массив ( [name] => таблицы [url] => таблицы ) [3] => Массив ( [name] => таблоиды [url] => таблоиды ) [4] => Массив ( [имя] => taco bell [url] => taco-bell ) [5] => Массив ( [name] => tacos [url] => tacos ) )
Я бы хотел переименовать все ключи массива, называемые «url», которые будут называться «value». Что было бы хорошим способом сделать это?
Вы можете использовать array_map()
для этого.
$tags = array_map(function($tag) { return array( 'name' => $tag['name'], 'value' => $tag['url'] ); }, $tags);
Прокрутите, установите новый ключ, отмените старый ключ.
foreach($tags as &$val){ $val['value'] = $val['url']; unset($val['url']); }
сforeach($tags as &$val){ $val['value'] = $val['url']; unset($val['url']); }
вы можете сделать что-то подобное
foreach($tags as &$tag){ $tag['value'] = $tag['url']; unset($tag['url']); }
сforeach($tags as &$tag){ $tag['value'] = $tag['url']; unset($tag['url']); }
Говоря о функциональном PHP, у меня есть более общий ответ:
array_map(function($arr){ $ret = $arr; $ret['value'] = $ret['url']; unset($ret['url']); return $ret; }, $tag); }
сarray_map(function($arr){ $ret = $arr; $ret['value'] = $ret['url']; unset($ret['url']); return $ret; }, $tag); }
Это должно работать в большинстве версий PHP 4+. Карта массива с использованием анонимных функций не поддерживается ниже 5.3.
Кроме того, примеры foreach выдают предупреждение при использовании строгой обработки ошибок PHP.
Вот небольшая многомерная функция переименования клавиш. Он также может использоваться для обработки массивов, чтобы иметь правильные ключи для целостности во всем приложении. Он не будет вызывать ошибок, если ключ не существует.
function multi_rename_key(&$array, $old_keys, $new_keys) { if(!is_array($array)){ ($array=="") ? $array=array() : false; return $array; } foreach($array as &$arr){ if (is_array($old_keys)) { foreach($new_keys as $k => $new_key) { (isset($old_keys[$k])) ? true : $old_keys[$k]=NULL; $arr[$new_key] = (isset($arr[$old_keys[$k]]) ? $arr[$old_keys[$k]] : null); unset($arr[$old_keys[$k]]); } }else{ $arr[$new_keys] = (isset($arr[$old_keys]) ? $arr[$old_keys] : null); unset($arr[$old_keys]); } } return $array; }
сfunction multi_rename_key(&$array, $old_keys, $new_keys) { if(!is_array($array)){ ($array=="") ? $array=array() : false; return $array; } foreach($array as &$arr){ if (is_array($old_keys)) { foreach($new_keys as $k => $new_key) { (isset($old_keys[$k])) ? true : $old_keys[$k]=NULL; $arr[$new_key] = (isset($arr[$old_keys[$k]]) ? $arr[$old_keys[$k]] : null); unset($arr[$old_keys[$k]]); } }else{ $arr[$new_keys] = (isset($arr[$old_keys]) ? $arr[$old_keys] : null); unset($arr[$old_keys]); } } return $array; }
сfunction multi_rename_key(&$array, $old_keys, $new_keys) { if(!is_array($array)){ ($array=="") ? $array=array() : false; return $array; } foreach($array as &$arr){ if (is_array($old_keys)) { foreach($new_keys as $k => $new_key) { (isset($old_keys[$k])) ? true : $old_keys[$k]=NULL; $arr[$new_key] = (isset($arr[$old_keys[$k]]) ? $arr[$old_keys[$k]] : null); unset($arr[$old_keys[$k]]); } }else{ $arr[$new_keys] = (isset($arr[$old_keys]) ? $arr[$old_keys] : null); unset($arr[$old_keys]); } } return $array; }
Использование простое. Вы можете либо сменить один ключ, как в вашем примере:
multi_rename_key($tags, "url", "value");
или более сложный мультикей
multi_rename_key($tags, array("url","name"), array("value","title"));
Он использует похожий синтаксис как preg_replace (), где количество $ old_keys и $ new_keys должно быть одинаковым. Однако, когда они не являются пустым ключом, добавляется. Это означает, что вы можете использовать его для добавления сортировки, если схема в ваш массив.
Используйте это все время, надеюсь, что это поможет!
foreach ($basearr as &$row) { $row['value'] = $row['url']; unset( $row['url'] ); }
Рекурсивная функция переименования php:
function replaceKeys($oldKey, $newKey, array $input){ $return = array(); foreach ($input as $key => $value) { if ($key===$oldKey) $key = $newKey; if (is_array($value)) $value = replaceKeys( $oldKey, $newKey, $value); $return[$key] = $value; } return $return; }
class DataHelper{ private static function __renameArrayKeysRecursive($map = [], &$array = [], $level = 0, &$storage = []) { foreach ($map as $old => $new) { $old = preg_replace('/([\.]{1}+)$/', '', trim($old)); if ($new) { if (!is_array($new)) { $array[$new] = $array[$old]; $storage[$level][$old] = $new; unset($array[$old]); } else { if (isset($array[$old])) { static::__renameArrayKeysRecursive($new, $array[$old], $level + 1, $storage); } else if (isset($array[$storage[$level][$old]])) { static::__renameArrayKeysRecursive($new, $array[$storage[$level][$old]], $level + 1, $storage); } } } } } /** * Renames array keys. (add "." at the end of key in mapping array if you want rename multidimentional array key). * @param type $map * @param type $array */ public static function renameArrayKeys($map = [], &$array = []) { $storage = []; static::__renameArrayKeysRecursive($map, $array, 0, $storage); unset($storage); } }
сclass DataHelper{ private static function __renameArrayKeysRecursive($map = [], &$array = [], $level = 0, &$storage = []) { foreach ($map as $old => $new) { $old = preg_replace('/([\.]{1}+)$/', '', trim($old)); if ($new) { if (!is_array($new)) { $array[$new] = $array[$old]; $storage[$level][$old] = $new; unset($array[$old]); } else { if (isset($array[$old])) { static::__renameArrayKeysRecursive($new, $array[$old], $level + 1, $storage); } else if (isset($array[$storage[$level][$old]])) { static::__renameArrayKeysRecursive($new, $array[$storage[$level][$old]], $level + 1, $storage); } } } } } /** * Renames array keys. (add "." at the end of key in mapping array if you want rename multidimentional array key). * @param type $map * @param type $array */ public static function renameArrayKeys($map = [], &$array = []) { $storage = []; static::__renameArrayKeysRecursive($map, $array, 0, $storage); unset($storage); } }
сclass DataHelper{ private static function __renameArrayKeysRecursive($map = [], &$array = [], $level = 0, &$storage = []) { foreach ($map as $old => $new) { $old = preg_replace('/([\.]{1}+)$/', '', trim($old)); if ($new) { if (!is_array($new)) { $array[$new] = $array[$old]; $storage[$level][$old] = $new; unset($array[$old]); } else { if (isset($array[$old])) { static::__renameArrayKeysRecursive($new, $array[$old], $level + 1, $storage); } else if (isset($array[$storage[$level][$old]])) { static::__renameArrayKeysRecursive($new, $array[$storage[$level][$old]], $level + 1, $storage); } } } } } /** * Renames array keys. (add "." at the end of key in mapping array if you want rename multidimentional array key). * @param type $map * @param type $array */ public static function renameArrayKeys($map = [], &$array = []) { $storage = []; static::__renameArrayKeysRecursive($map, $array, 0, $storage); unset($storage); } }
Использование:
DataHelper::renameArrayKeys([ 'a' => 'b', 'abc.' => [ 'abcd' => 'dcba' ] ], $yourArray);
Это из дублированного вопроса
$json = '[ {"product_id":"63","product_batch":"BAtch1","product_quantity":"50","product_price":"200","discount":"0","net_price":"20000"}, {"product_id":"67","product_batch":"Batch2","product_quantity":"50","product_price":"200","discount":"0","net_price":"20000"} ]'; $array = json_decode($json, true); $out = array_map(function ($product) { return array_merge([ 'price' => $product['product_price'], 'quantity' => $product['product_quantity'], ], array_flip(array_filter(array_flip($product), function ($value) { return $value != 'product_price' && $value != 'product_quantity'; }))); }, $array); var_dump($out);