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 Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


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

> Описание: Извлечение значения из массива любой глубины вложенности
Mandalorian
Отправлено: 12 Декабря, 2021 - 12:47:38
Post Id


Новичок


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


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




Здравствуйте! Стоит вот такая задача.

Реализуйте функцию getIn, которая извлекает из массива (который может быть любой глубины вложенности) значение по указанным ключам. Аргументы:

Исходный массив
Массив ключей, по которым ведется поиск значения
В случае, когда добраться до значения невозможно, возвращается null.

PHP:
скопировать код в буфер обмена
  1.  
  2. <?PHP
  3.  
  4. $data = [
  5.     'user' => 'ubuntu',
  6.     'hosts' => [
  7.         ['name' => 'web1'],
  8.         ['name' => 'web2', null => 3, 'active' => false]
  9.     ]
  10. ];
  11.  
  12. getIn($data, ['undefined']); // null
  13. getIn($data, ['user']); // 'ubuntu'
  14. getIn($data, ['user', 'ubuntu']); // null
  15. getIn($data, ['hosts', 1, 'name']); // 'web2'
  16. getIn($data, ['hosts', 0]); // ['name' => 'web1']
  17. getIn($data, ['hosts', 1, null]); // 3
  18. getIn($data, ['hosts', 1, 'active']); // false
  19.  


Вроде как решил ее через рекурсию.
PHP:
скопировать код в буфер обмена
  1.  
  2. function getIn($array, $keys)
  3. {
  4.     $curr = array_shift($keys);
  5.    
  6.             if(is_array($array) and array_key_exists($curr, $array)) {
  7.                 $result = $array[$curr];
  8.                
  9.                 if (count($keys) > 0) {
  10.                    $result = getIn($result, $keys);
  11.                 }    
  12.                 return $result;  
  13.             }
  14. }  
  15.  


Интересует решение через foreach, чето не могу додуматься...
 
 Top
Mandalorian
Отправлено: 13 Декабря, 2021 - 16:04:41
Post Id


Новичок


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


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




Вобщем, вроде, решил.

PHP:
скопировать код в буфер обмена
  1.  
  2. function getIn($data, $keys)
  3. {
  4.     $current = $data;
  5.     $result = null;
  6.     foreach($keys as $k=>$key) {
  7.         if(is_array($current) and array_key_exists($key, $current)){
  8.             $result = $current[$key];
  9.             unset($keys[$k]);
  10.             if(count($keys) > 0) {
  11.                 $result = getIn($result, $keys);
  12.             }  
  13.         }    
  14.     }
  15.     return $result;
  16. }  
  17.  


Если у кого есть варианты получше, было бы интерестно посмотреть.
 
 Top
MouseZver
Отправлено: 16 Декабря, 2021 - 13:07:30
Post Id



Новичок


Покинул форум
Сообщений всего: 58
Дата рег-ции: Июнь 2017  
Откуда: php.ru


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




PHP:
скопировать код в буфер обмена
  1. <?PHP
  2.  
  3. declare ( strict_types = 1 );
  4.  
  5. /*
  6.         @ Author: MouseZver
  7.         @ Email: mouse-zver@xaker.ru
  8.         @ php-version 8.0
  9. */
  10.  
  11. namespace Nouvu\Config;
  12.  
  13. use InvalidArgumentException;
  14.  
  15. final class Config
  16. {
  17.         private mixed $return;
  18.        
  19.         public function __construct ( private array $config = [], private string $separator = '.' )
  20.         {}
  21.  
  22.         public function set( string | int $offset = null, callable $callable ): void
  23.         {
  24.                 $this -> segments( 'set', $offset );
  25.                
  26.                 $callable( $this -> return );
  27.         }
  28.  
  29.         public function get( string | int $offset = null, mixed $default = null ): mixed
  30.         {
  31.                 try
  32.                 {
  33.                         $this -> segments( 'get', $offset );
  34.                        
  35.                         return $this -> return;
  36.                 }
  37.                 catch ( InvalidArgumentException )
  38.                 {
  39.                         return $default;
  40.                 }
  41.         }
  42.        
  43.         public function has( string | int $offset ): bool
  44.         {
  45.                 try
  46.                 {
  47.                         $this -> segments( 'has', $offset );
  48.                        
  49.                         return true;
  50.                 }
  51.                 catch ( InvalidArgumentException )
  52.                 {
  53.                         return false;
  54.                 }
  55.         }
  56.        
  57.         private function segments( string $method, string | int | null $offset ): void
  58.         {
  59.                 $this -> return = &$this -> config;
  60.                
  61.                 if ( is_null ( $offset ) )
  62.                 {
  63.                         return;
  64.                 }
  65.                
  66.                 foreach ( explode ( $this -> separator, ( string ) $offset ) AS $name )
  67.                 {
  68.                         if ( $method == 'set' || ( isset ( $this -> return[$name] ) || is_array ( $this -> return ) && array_key_exists ( $name, $this -> return ) ) )
  69.                         {
  70.                                 $this -> return = &$this -> return[$name];
  71.                         }
  72.                         else
  73.                         {
  74.                                 throw new InvalidArgumentException( 'Not found key name - ' . $name );
  75.                         }
  76.                 }
  77.         }
  78. }


$c = new \Nouvu\Config\Config( $array );

var_dump ( $c -> get( 'hosts.name' ) ); // web2
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Вопросы новичков »


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



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

 
Powered by ExBB FM 1.0 RC1. InvisionExBB