Php многомерный массив все значения по ключу

Как взять из многомерного массива значение, имея ключи этого значения в другом массиве или строке?

Вопрос звучит совершенно непонятно, поэтому поясню на примере кода:

$data['name1']['name2']['name3'] = 'some data'; // это элемент, который мы хотим получить $keys_str = 'name1,name2,name3'; // можно вот так получить ключи в строку $keys_arr = ['name1', 'name2', 'name3'] // а можно вот так в массив $keys_str = '[name1][name2][name3]'; // а можно в строку и так $keys_str = '["name1"]["name2"]["name3"]'; // или даже так

И в итоге, имея только ключи в том или ином виде и массив, к которому они подойдут (могут подойти) нам нужно получить значение по этим ключам в массиве, ну или ответ, что такого элемента не существует. Как это можно наиболее красиво и понятно реализовать?

Уточнение: ключи собираются из определенной строки при ее рекурсивной обработке, то есть мы их получаем последовательно и в целом можем сложить куда угодно, хоть в какой угодно массив, хоть в какую угодно строку, но суть в том, что после этого мы должны проверить, есть ли с набором таких ключей элемент в некоем отдельном массиве, или нет.

/** * Retrieves an element within multidimensional array stored on any level by it's keys. * @param array $data A multidimensional array with data * @param array $keys A list of keys to element stored in $data * @return null|mixed Returns null if elements is not found. Element's value otherwise. */ function getElement(array $data, array $keys) < /** перебираем ключи */ foreach($keys as $key) < /** * Если текущий элемент - массив, и в нём есть ключ, то текущий массив перезаписываем на новый. * А если ключа такого нет или это не массив, то возвращаем null. */ if (is_array($data) && array_key_exists($key, $data)) < $data = $data[$key]; >else < return null; >> return $data; >
$data = [ 'key1' => [ 'key2' => [ 'key3' => [ 'value' => 123 ] ] ] ]; echo getElement($data, ['key1', 'key2', 'key3', 'value']); // => 123
/** * Retrieves an element within multidimensional array stored on any level by it's keys. * @param array $data A multidimensional array with data * @param string|array $keys A list of keys to element stored in $data as an array or a string with joined keys with a dot (.) * @return null|mixed Returns null if elements is not found. Element's value otherwise. */ function getElement(array $data, $keys) < if (is_string($keys)) $keys = explode('.', $keys); /** перебираем ключи */ foreach($keys as $key) < /** * Если текущий элемент - массив, и в нём есть ключ, то текущий массив перезаписываем на новый. * А если ключа такого нет или это не массив, то возвращаем null. */ if (is_array($data) && array_key_exists($key, $data)) < $data = $data[$key]; >else < return null; >> return $data; >
echo getElement($data, 'key1.key2.key3.value'); // => 123

Источник

Читайте также:  Java streams api map

Обработка многомерных ассоциативных массивов PHP

В своей статье я хочу поговорить об обработке многомерных ассоциативных массивов в PHP. На мой взгляд, не всегда удобно получать необходимую информацию из многомерного массива. Одно дело если массив двумерный:

 array( "key1" => "value1", "key2" => "value2" ) ); ?> 

То, конечно, получить, интересующие нас значения, легко:

echo $array['dimension1']['key1']; // value1 

Но, а если мы имеем массив n-мерный? Например, пятимерный:

$array = array( 'dimension1' => array( 'dimension2' => array( 'dimension3' => array( 'dimension4' => array( 'dimension5' => array( 'value1' => 'Hey! I\'m value1', 'value2' => 'Hey! I\'m value2' ) ) ) ) ) ); 

То, чтобы получить значение по ключу, например, «value1», нам надо прописать такой код:

echo $array["dimension1"]["dimension2"]["dimension3"]["dimension4"]["dimension5"]["value1"]; // Hey! I'm value1 

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

echo easyA($array)->dimension1->dimension2->dimension3->dimension4->dimension5->value1; // Hey! I'm value1 

Согласитесь, ведь смотрится, действительно, куда симпотичней, по сравнению со стандартной записью.

Итак, для начала нам понадобится создать класс, который будет обрабатывать наш массив. Назовем его easyArray и сделаем его одиночкой (Singleton):

class easyArray < private static $instance; // Состояние класса. private $Array; // Массив, который был передан классу. private function __construct()< // Запилили конструктор. >private function __clone() < // Запилили метод клонирования. >public static function getInstance() < if(null === self::$instance)< self::$instance = new self(); >return self::$instance; > 

После того, как наш класс стал одиночкой, добавим ему весьма важный метод, который будет записывать полученный массив в приватную переменную:

 public function loadArray($newArray)< if(is_array($newArray))< $this->Array = $newArray; return $this; >else < $error = 'К сожалению вы передали не массив.'; throw new Exception($error); >> 

Из кода видно, что мы также осуществляем проверку того, что было передано на вход метода. В случае того, если был передан все-таки не массив, мы просто выбросим исключение с ошибкой «К сожалению вы передали не массив.». Если проверка прошла успешно, то мы записываем в приватную переменную полученный массив и возвращаем текущий объект.

Читайте также:  Java аннотации зачем они

Ну а теперь мы переопределим магический метод «__get()» нашего класса. Это необходимо для того, чтобы получить желаемый нами результат. Итак:

 public function __get($index)< if(isset($this->Array[$index]))< if(is_array($this->Array[$index]))< $this->loadArray($this->Array[$index]); return $this; >else< return $this->Array[$index]; > >else < $error = 'Отсутствует ключ ('.$index.') в массиве'; throw new Exception($error); >> 

Первым делом, мы проверяем наличие запрошенного ключа в массиве, в случае отсутствия такового, выбрасываем исключение с ошибкой «‘Отсутствует ключ (‘.$index.’) в массиве’«. Далее проверяем является ли, запрошенный ключ массивом. Если по такому ключу в массиве находится значение, то просто возвращаем это значение. А если все-таки это массив, то мы отправляем его методу «loadArray($newArray)» и возвращаем текущий объект ($this).

И, как последний штрих нашего класса, добавим метод, который будет возвращать текущий массив, с которым работает наш класс:

 public function arrayReturn()< return $this->Array; > 

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

echo easyArray::getInstance()->loadArray($array)->dimension1->dimension2->dimension3->dimension4->dimension5->value1; // Hey! I'm value1 

Стало даже длиннее, чем было. Но эта проблема решаема, и для этого нам понадобится простая функция:

function easyA($newArray)< return easyArray::getInstance()->loadArray($newArray); > 

Ну, а теперь проверим, что мы получили в итоге:

 array( 'dimension2' => array( 'dimension3' => array( 'dimension4' => array( 'dimension5' => array( 'value1' => 'Hey! I\'m value1', 'value2' => 'Hey! I\'m value2' ) ) ) ) ) ); require_once('easyArray.php'); require_once('easyArrayFunction.php'); echo easyA($array)->dimension1->dimension2->dimension3->dimension4->dimension5->value1; // Hey! I\'m value1 echo easyA($array)->dimension1->dimension2->dimension3->dimension4->dimension5->value2; // Hey! I\'m value2 ?> 

Помимо этого, данному классу можно передавать конфигурационные файлы типа:

 array( 'dimension2' => array( 'dimension3' => array( 'dimension4' => array( 'dimension5' => array( 'value1' => 'Hey! I\'m value1 from file array.php', 'value2' => 'Hey! I\'m value2 from file array.php' ) ) ) ) ) ); ?> 
echo easyA(require_once('array.php'))->dimension1->dimension2->dimension3->dimension4->dimension5->value1; // Hey! I'm value1 from file array.php 

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

Источник

Как в многомерном массиве по ключу найти значения

Подскажите, есть ли функция php, которая в многомерном массиве находит значения по ключам?
Если нет, то помогите написать функцию, которая находит значения (в моём случае это массивы) по ключам и складывает значения ([0]+[0]+[0],[1]+[1]+[1],[2]+[2]+[2]).

function aaa(){} print_r (aaa("GNFA","EPK")); //array(200,220,240); print_r (aaa("GNFCA","EPK","GBHDFE")); //array(240,270,300);

Как в многомерном ассоциативном массиве найти ключ элемента 1 уровня, по ключу и значению 2 уровня?
есть массив: Array ( => Array ( => 1 => Северный .

Читайте также:  Пользовательский тип данных java

Как найти все значения одного массива в другом многомерном массиве?
Доброго времени суток! Вообще задача сначала стояла так, но перемучившись решил сложить это бремя.

Как реализовать поиск значения в многомерном массиве
есть двухмерный массив: double Array = new double; 100 это количество строк 5 это количество.

Как найти элемент в многомерном массиве?
Здравствуйте, форумчане! Есть два многомерных массива. Глубина 2 и 4. Нужный элемент может.

ЦитатаСообщение от alanat Посмотреть сообщение

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
cat \x | /c/t/usr/php74/php ?php $prs = array( "av"=>array("EPK"=>array(40,50,60)), "ap"=>array("GBHDFE"=>array(70,80,90),"GBHDE"=>array(100,110,120)), "as"=>array("GNFCA"=>array(130,140,150),"GNFA"=>array(160,170,180)) ); function find_n_sum(&$arr, $key) { if (isset($arr[$key])) return array_sum($arr[$key]); foreach(array_keys($arr) AS $str) { if (is_array($arr[$str]) && ($r = find_n_sum($arr[$str], $key)) !== FALSE) return $r; } return FALSE; } echo ' EPK = ', find_n_sum($prs, 'EPK'), "\n GNFA = ", find_n_sum($prs, 'GNFA'),"\n", "\n ap = ", find_n_sum($prs, 'ap'),"\n"; x EPK = 150 GNFA = 510 ap = PHP Fatal error: Uncaught Error: Unsupported operand types in Standard input code:9
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
 $prs = array( "av"=>array("EPK"=>array(40,50,60)), "ap"=>array("GBHDFE"=>array(70,80,90),"GBHDE"=>array(100,110,120)), "as"=>array("GNFCA"=>array(130,140,150),"GNFA"=>array(160,170,180)) ); function find_n_sums(&$arr, $keys) { $r = array(); foreach($keys AS $k) { foreach(array_keys($arr) AS $kk) if ( isset($arr[$kk][$k])) { $r[$k] = array_sum($arr[$kk][$k]); continue 2; } $r[$k] = FALSE; } return $r; } var_export(find_n_sums($prs, ['GNFA', 'EPK', 'ap']));

Возможно оптимальнее один раз проходить первый уровень при этом получая суммы для всех ключей
. т.е как-бы поменять два foreach местами ))
как-то не обдумывал это

Источник

Оцените статью