Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Переименование ключей массива

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (2): [1] 2 »   

> Без описания
alidex
Отправлено: 24 Декабря, 2013 - 11:30:22
Post Id


Новичок


Покинул форум
Сообщений всего: 35
Дата рег-ции: Дек. 2010  


Помог: 0 раз(а)




Здравствуйте!
Помогите пожалуйста с заменой опредделенных имен массива вида
PHP:
скопировать код в буфер обмена
  1.  
  2. (
  3.     [0] => Array
  4.         (
  5.             [price] => 15000
  6.             [item_code] => Q7533A
  7.             [model] => Color LaserJet 3000
  8.                 )
  9.  
  10.     [1] => Array
  11.         (
  12.            [price] => 10000
  13.             [item_code] => Q7535A
  14.             [model] => Color LaserJet 3500
  15.         )
  16.  
  17. )
  18.  

Как переимоновать ключи [item_code] и [model] в article и [name]

пробовал через string_replace() но оно ничего не меняет...
 
 Top
OrmaJever Модератор
Отправлено: 24 Декабря, 2013 - 11:36:13
Post Id



Активный участник


Покинул форум
Сообщений всего: 7540
Дата рег-ции: Янв. 2010  
Откуда: Чернигов


Помог: 299 раз(а)




нужно создать новые индексы, а старые удалить


-----
Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
 
 Top
alidex
Отправлено: 24 Декабря, 2013 - 11:50:27
Post Id


Новичок


Покинул форум
Сообщений всего: 35
Дата рег-ции: Дек. 2010  


Помог: 0 раз(а)




OrmaJever, спасибо, только как это сделать? чуть подробнее пожалуйста. И еще, есть вероятность, что массивы будут иметь разную очередность ключей
 
 Top
OrmaJever Модератор
Отправлено: 24 Декабря, 2013 - 11:53:55
Post Id



Активный участник


Покинул форум
Сообщений всего: 7540
Дата рег-ции: Янв. 2010  
Откуда: Чернигов


Помог: 299 раз(а)




как-то так
PHP:
скопировать код в буфер обмена
  1. $keys = array('item_code' => 'new_item_code', 'model' => 'new_model');
  2.  
  3. foreach($array as $k => $v) {
  4.   if(isset($keys[$k])) {
  5.      $array[$keys[$k]] = $v;
  6.      unset($keys[$k]);
  7.   }
  8. }


-----
Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
 
 Top
alidex
Отправлено: 24 Декабря, 2013 - 12:12:46
Post Id


Новичок


Покинул форум
Сообщений всего: 35
Дата рег-ции: Дек. 2010  


Помог: 0 раз(а)




OrmaJever
Спасибо за код.
как я понял вместо $array я подставляю свою переменную с массивом ( на выходе массив если он был $array так и останется $array?)
если все так то замены не произошло...

(Отредактировано автором: 24 Декабря, 2013 - 12:13:28)

 
 Top
IllusionMH
Отправлено: 24 Декабря, 2013 - 12:18:18
Post Id



Активный участник


Покинул форум
Сообщений всего: 4254
Дата рег-ции: Февр. 2011  
Откуда: .kh.ua


Помог: 242 раз(а)




alidex, у вас 2 уровня вложенности, а пример приведен просто для демонстрации принципа. Вам предстоит самостоятельно выполнить пару манипуляций чтобы получить желаемый результат.
 
 Top
alidex
Отправлено: 24 Декабря, 2013 - 12:18:53
Post Id


Новичок


Покинул форум
Сообщений всего: 35
Дата рег-ции: Дек. 2010  


Помог: 0 раз(а)




IllusionMH, ок, спасибо, буду пробовать
(Добавление)
попробовал вот так, но пока ничего... я вообще в правильном направлении двигаюсь?)
PHP:
скопировать код в буфер обмена
  1.  
  2. $keys = array('item_code' => 'new_item_code', 'model' => 'new_model');
  3.      foreach($array as $k => $v) {
  4.       if(isset($keys[$k])) {
  5.                          for ($i = 0; $i < count($array); $i++){
  6.          
  7.                          $array[$i][$keys[$k]] = $v;
  8.                                
  9.                  }
  10.                  unset($keys[$k]);
  11.       }
  12.     }
  13.  

(Отредактировано автором: 24 Декабря, 2013 - 12:38:52)

 
 Top
IllusionMH
Отправлено: 24 Декабря, 2013 - 12:40:34
Post Id



Активный участник


Покинул форум
Сообщений всего: 4254
Дата рег-ции: Февр. 2011  
Откуда: .kh.ua


Помог: 242 раз(а)




alidex, нет. Внешний цикл должен перебирать ваши элементы, а внутренний перебирает его ключи и меняет.
 
 Top
VenZell
Отправлено: 24 Декабря, 2013 - 12:51:32
Post Id


Частый гость


Покинул форум
Сообщений всего: 237
Дата рег-ции: Июнь 2013  


Помог: 12 раз(а)




Рекурсивная функция для переименования ключей
PHP:
скопировать код в буфер обмена
  1. function renameArrayKey(array $array, $old_name, $new_name) {
  2.    $output = array();
  3.        
  4.    if (empty($array)
  5.       || (empty($old_name) || !is_scalar($old_name))
  6.       || (empty($new_name) || !is_scalar($new_name))) {
  7.          return array();
  8.    }
  9.        
  10.    foreach ($array as $key => $value) {
  11.        
  12.       if (is_array($value)) {
  13.          $output[$key] = renameArrayKey($value, $old_name, $new_name);
  14.          continue;
  15.       }
  16.                
  17.       $should_rename = $key === $old_name;
  18.       $new_key = ($should_rename) ? $new_name : $key;
  19.       $output[$new_key] = $value;              
  20.    }
  21.        
  22.    return $output;
  23. }

Пример использования:
Спойлер (Отобразить)

Вывод:
Спойлер (Отобразить)

Решение вашей задачи:
PHP:
скопировать код в буфер обмена
  1. $data = array (
  2.         0 => array (
  3.                 'price' => '15000',
  4.                 'item_code' => '7533A',
  5.                 'model' => 'Color LaserJet 3000'
  6.         ),
  7.  
  8.         1 => array (
  9.                 'price' => '10000',
  10.                 'item_code' => 'Q7535A',
  11.                 'model' => 'Color LaserJet 3500'
  12.         )
  13. );
  14. $data = renameArrayKey($data, 'item_code', 'article');
  15. $data = renameArrayKey($data, 'model', 'name');

(Отредактировано автором: 24 Декабря, 2013 - 13:31:16)

 
 Top
EuGen Администратор
Отправлено: 24 Декабря, 2013 - 13:04:26
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


Помог: 707 раз(а)




VenZell пишет:
if (!is_array($array)
|| empty($old_name)
|| empty($new_name)) {
return false;
}

Если устанавливать проверку, то, во-первых, нет смысла задавать пустые значения параметров по-умолчанию (функция, напротив, должна протестовать в таком случае против того, что они не переданы), а, во-вторых, проверять ключи через is_scalar - так как проверка пропустит что-нибудь наподобие объектов, что приведёт к неожиданным результатам. Кроме того, я бы вместо is_array добавил type-hinting для первого параметра.


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
VenZell
Отправлено: 24 Декабря, 2013 - 13:16:26
Post Id


Частый гость


Покинул форум
Сообщений всего: 237
Дата рег-ции: Июнь 2013  


Помог: 12 раз(а)




Я так понимаю, что надо было сделать вот так:
PHP:
скопировать код в буфер обмена
  1. function renameArrayKey(array $array, string $old_name, string $new_name)

PHP:
скопировать код в буфер обмена
  1. if (empty($array)
  2.    || empty($old_name)
  3.    || empty($new_name)) {
  4.        return false;
  5. }

?
 
 Top
EuGen Администратор
Отправлено: 24 Декабря, 2013 - 13:23:32
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


Помог: 707 раз(а)




Нет, потому что type-hinting для скалярных типов данных не поддерживается, поэтому придётся проверять в функции. Кроме того, если массив пуст - возврат false - неочевидное решение. Корректнее возвратить пустой массив.


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
VenZell
Отправлено: 24 Декабря, 2013 - 13:27:09
Post Id


Частый гость


Покинул форум
Сообщений всего: 237
Дата рег-ции: Июнь 2013  


Помог: 12 раз(а)




EuGen, спасибо, о type-hitting не знал, как и о нюансе с объектами. Постараюсь запомнить.

Отредактировал свое сообщение.
 
 Top
EuGen Администратор
Отправлено: 24 Декабря, 2013 - 13:30:06
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


Помог: 707 раз(а)




VenZell
is_string не совсем верно, ведь PHP корректно обрабатывает и ключи других типов данных (то есть, они являются допустимыми, пусть и преобразуются согласно внутренним правилам)


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
VenZell
Отправлено: 24 Декабря, 2013 - 13:32:18
Post Id


Частый гость


Покинул форум
Сообщений всего: 237
Дата рег-ции: Июнь 2013  


Помог: 12 раз(а)




EuGen, теперь окончательно понял, к чему был упомянут is_scalar. Еще раз спасибо.
 
 Top
Страниц (2): [1] 2 »
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Вопросы новичков »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB