И снова Дорого дня всем желающим помочь, есть набор ключей для массива $qu 'select action key ey' мне надо построить цепочку для доступа к элементу массива и его изменения $qu[select][action][key][ey] = 'item' Код (Text): $qu['select'] = array("action"=>array("key"=>array('ss', "ey"=>array('second')))); $point = explode(" ", 'select action key ey'); foreach($point as $key) { $qu[$key]; } проблема в том что в следующей акте цикла значение ключа и ссылка на массив уже не совпадают первый $qu['select'] второй $qu['action'] а надо $qu['select']['action'] надо как то переопределять ссылку на массив и строить цепочку ключей если есть идеи или кто либо что либо делал подобное пожалуйста подскажите.
@Conus а смысл новые темы плодить, я вам уже писал ответ, доделать не получилось? PHP: <?php $qu['select'] = array("action"=>array("key"=>array('ss', "ey"=>array('second')))); $point = explode(" ", 'select action key ey'); function my ($qu, $point){ foreach($point as $value){ if(isset($qu[$value])){ print_r($qu[$value]); my ($qu[$value], $point); break; } } } my($qu, $point); ?>
@MouseZver ему я так понял нужно зачем то то что внутри массива. --- Добавлено --- @Conus можно такую шляпу еще написать =) uno : PHP: <?php $qu['select'] = array("action"=>array("key"=>array('ss', "ey"=>array('second')))); $point = explode(" ", 'select action key ey'); function my ($qu, $point){ $i = false; foreach($point as $value){ if(isset($qu[$value])){ $i = true; my ($qu[$value], $point); break; } } if($i === false && isset($qu[0])){ echo $qu[0]; } } my($qu, $point); ?> due : PHP: <?php $qu['select'] = array("action"=>array("key"=>array('ss', "ey"=>array('second')))); $string = 'select action key ey'; $b = null; foreach ( explode ( ' ', $string ) AS $i ) { $b = $b[$i] ?? $qu[$i]; } if(is_array($b)){ foreach($b as $value){ echo $value.'<br>'; } }else{ echo $b; } ?> оба варианта рабочие
спасибо но а как вы в вашей функции изменяете последний элемент и возвращаете массив $qu[select][action][key][ey] = 'item' а запрыгнуть в массив и я могу Код (Text): function point($mass, $m, $NewItem) { return 'Array' == ''.$mass ? ('Array' == ''.array_values($mass)[ count($mass)-1 ] ? array_keys($mass)[ count($mass)-1 ] .' ' .$m[array_keys($mass)[ count($mass)-1 ] ].' ' .point(array_values($mass)[count($mass)-1], $m[array_keys($mass)[ count($mass)-1 ] ]) : '')// array_keys($mass)[ count($mass)-1 ] ) : false; }
@Conus цепочка ключей выглядит как-то жутко неудобно. Может тебе подойдет такая адресация: 'first.second.third' ? В Laravel, например, так принято адресовать элементы конфигурации. Они доступны как массив произвольной размерности. Если например Код (Text): config() == [ 'alfa' => 10, 'beta' => [ 'gama' => 20, 'sigma'=> 30 ], 'theta' => 40 ]; то Код (Text): config('beta') == ['gama' => 20, 'sigma'=> 30] а Код (Text): config(beta.sigma') == 30 ну и т.д. Если сам "интерфейс доступа" подходит, то реализацию могу подсказать.
PHP: class Config { private $config = []; public function __construct(array $config) { $this->config = $config; } public function get($name = null, $default = null) { if (is_null($name)) { return $this->config; } $segments = explode('.', $name); $ptr = & $this->config; foreach ($segments as $s) { if (!isset($ptr[$s])) { return $default; } $ptr = & $ptr[$s]; } return $ptr; } public function set($name, $value) { $segments = explode('.', $name); $n = count($segments); $ptr = & $this->config; foreach ($segments as $s) { if (--$n) { if (!array_key_exists($s, $ptr)) { $ptr[$s] = []; } elseif (!is_array($ptr[$s])) { throw new \InvalidArgumentException("Scalar \"{$s}\" in the path \"{$name}\""); } $ptr = & $ptr[$s]; } else { $ptr[$s] = $value; } } return $this; } } Использование: PHP: $array = [ 'alfa' => 10, 'beta' => [ 'gama' => 20, 'sigma'=> 30 ], 'theta' => 40 ]; $config = new Config($array); var_dump($config->get('beta')); // array(2) { ["gama"]=> int(20) ["sigma"]=> int(30) } echo "\n"; $config->set('beta.sigma', 1000); var_dump($config->get()); // array(3) { ["alfa"]=> int(10) ["beta"]=> array(2) { ["gama"]=> int(20) ["sigma"]=> int(1000) } ["theta"]=> int(40) } echo "\n";
@artoodetoo PHP: $a = ['a'=>['b'=>1]]; $s = new class( $a ) { protected $a = [], $return = []; public function __construct ( array $array ) { $this -> a = $array; } public function __get( string $string ) { if ( $this -> return == [] ) { $this -> return = &$this -> a; } if ( is_array ( $this -> return ) && array_key_exists ( $string, $this -> return ) ) { $this -> return = &$this -> return[$string]; return $this; } return null; # либо ошибку кинуть + юзать маг метод isset } public function __set( string $name, $value ) { $this -> return[$name] = $value; $this -> return = &$this -> a; } public function get() { $return = $this -> return ?: $this -> a; $this -> return = &$this -> a; return $return; } }; PHP: $s -> a->b=3; $s->a->b->get(); $s -> a->b=['c'=>5]; echo $s->a->b->c->get();