Всем привет Подскажите пожалуйста, как из многомерного массива вывести несколько элементов, причем из нескольких массивов. Например, из каждого массива мне надо вывести a и d. Но я знаю только, как вывести один элемент одного массива. Вот например сам многомерный массив: $mymass = [ [a, b, c, d, ...], [a, b, c, d, ...], [a, b, c, d, ...], [a, b, c, d, ...], [a, b, c, d, ...], [a, b, c, d, ...], ... ];
Код (Text): <?php //$mymass1, $mymass2, $mymass3... $array_names = array('mymass1', 'mymass2', 'mymass3'); foreach ($array_names as $arr) { foreach ($$arr as $tr) { echo $tr['a'] . $tr['d']; } } ?> https://www.php.net/manual/ru/language.variables.variable.php https://www.php.net/manual/ru/control-structures.foreach.php
Если я правильно понимаю, у вас немного не то что мне надо... У вас получился одномерный массив. У меня же получается следующая конструкция: $mymass = array( array("a", "b", "c", "d"), array("a", "b", "c", "d"), array("a", "b", "c", "d"), array("a", "b", "c", "d"), и так далее.. ); Или сокращенно то, что выше писал в сообщении. Мне надо из каждого array взять например "a" и "d" чтобы вывести их или сделать другие манипуляции.
Что значит "взять например "a" и "d" чтобы вывести их"? Вывести первый и четвертый элементы всех массивов? Тогда так: PHP: <?php $mymass = [ ["a1", "b1", "c1", "d1"], ["a2", "b2", "c2", "d2"], ["a3", "b3", "c3", "d3"], ["a4", "b4", "c4", "d4"], ]; foreach($mymass as $arr){ echo "a=", $arr[0], " d=", $arr[3], "\n"; } ?> /* a=a1 d=d1 a=a2 d=d2 a=a3 d=d3 a=a4 d=d4 */
Супер! Спасибо, получилось. Теперь задача усложняется... Есть еще один многомерный массив, например $mymass2. В нем тоже находятся массивы с данными, как в $mymass. Причем в массивах, многомерных массивов $mymass и $mymass2, данные как строчные, так и цифирные, а есть совсем пустые. Мне надо находить одинаковые элементы в массивах, этих двух многомерных массивов. Но как валидатно это записать не знаю...
Пример в студию. Массивов и того, что в них искать. А так же, как должен выглядеть вывод результатов поиска.
Будет сложно объяснить... Ну например, есть два многомерных массива $mymass и $mymass2, это я уже говорил. В них есть массивы с данными о сделанных покупках. В этих данных адреса магазинов, ФИО клиента, телефон, дата покупки, сумма покупки и т.д. Данные из массивов много мерных массивов $mymass и $mymass2, могут отличаться (где-то больше, где-то меньше, где-то вообще отсутствует ФИО но есть адрес). Так как собраны разными конторами. Задача сделать так, чтобы в автоматическом режиме, из $mymass и $mymass2, находились похожие данные и выводились на экран. Например поиск по дате, адресу магазина, ФИО и оплаченной сумме. Но как сказал выше, чего-то может не быть в одном из массивов. Это надо для сверки поступивших денег за товары.
Тогда будет сложно ответить. Что в вашем понимании "похожие данные"? Что и как должно выводиться на экран? Искать в многомерном массиве строки с одинаковыми значениями полей можно как-то так (На примере поиска в адресах (поле 'addr') значения 'Адрес2'): Спойлер: Пример PHP: <style> .search{ color: red; } </style> <?php $mass1 = [ [ 'addr' => 'Адрес1', 'fio' => 'Иванов Иван Иванович', 'tel' => '223322223322', 'date' => '05-Jan-23 9:24', 'sum' => 322 ], [ 'addr' => 'Адрес2', 'fio' => 'Иванов Иван Иванович', 'tel' => '223322223322', 'date' => '15-Feb-22 19:12', 'sum' => 1000 ], [ 'addr' => 'Адрес1', 'fio' => 'Петров Петр', 'tel' => '', 'date' => '09-Dec-22 7:40', 'sum' => 30122 ], [ 'addr' => 'Адрес3', 'fio' => 'Сидоров Иван', 'tel' => '', 'date' => '24-Aug-22 17:44', 'sum' => 30122 ], ]; $mass2 = [ [ 'addr' => 'Адрес1', 'fio' => 'Иванов Иван Иванович', 'tel' => '223322223322', 'date' => '05-Jan-23 9:24', 'sum' => 322 ], [ 'addr' => 'Адрес2', 'fio' => 'Иванов Иван Иванович', 'tel' => '223322223322', 'date' => '01-Jan-23 9:24', 'sum' => 322 ], [ 'addr' => 'Адрес2', 'fio' => 'Иванов Иван Иванович', 'tel' => '223322223322', 'date' => '15-Feb-22 19:12', 'sum' => 1000 ], [ 'addr' => 'Адрес1', 'fio' => 'Петров Петр', 'tel' => '', 'date' => '09-Dec-22 7:40', 'sum' => 30122 ], [ 'addr' => 'Адрес3', 'fio' => 'Сидоров Иван', 'tel' => '', 'date' => '24-Aug-22 17:44', 'sum' => 15026 ], [ 'addr' => 'Адрес2', 'fio' => 'Сидоров Сидор Сидорович', 'tel' => '', 'date' => '12-Jul-22 12:18', 'sum' => 22 ], ]; function arr_search($arr, $field, $value){ $keys = array_keys(array_column($arr, $field), $value); foreach($keys as $key){ $res = ''; foreach($arr[$key] as $name => $value){ $value = "[$value]"; $res .= ($name == $field) ? '<span class="search">' . $value . '</span>' : $value; if ($name != 'sum'){ $res .= ', '; } } echo $res, "<br>\n"; } } //На примере поиска в адресах (поле 'addr') значения 'Адрес2' echo "<h3>Поиск в первом массиве:</h3>\n"; arr_search($mass1, 'addr', 'Адрес2'); echo "<h3>Поиск во втором массиве:</h3>\n"; arr_search($mass2, 'addr', 'Адрес2'); ?> Этот пример в песочнице: https://extendsclass.com/php-bin/7195105 Автоматический перебор всех возможных полей и их совпадающих значений, а так же, как должен выглядеть вывод всего этого "безобразия", попробуйте реализовать сами. Когда можете лучше объяснить задачу. Хотя бы себе. ) Грамотно сформулированная задача = половина решения.
В целом ваш пример очень хорош. Единственное только в моей задаче нету ключей. То есть, у меня есть многомерный массив, с массивами, в которых данные в определенном порядке. Например сначала дата, затем имя, адрес, телефон, сумма и т.д. И вот надо, чтобы из двух многомерных массивов шел поиск на похожие данные. Пример: Идет сначала поиск по дате (нашел 17 одинаковых дат) - Пошел поиск по имени (из 17 найденных по дате 3 совпадения по ФИО) - далее адрес совпал и телефон - проверяем сумму покупки (человек делал 3 разные покупки в одну дату) - Выводим все на экран в два столбца, например левый столбец из одного многомерного массива, правый столбец из другого. Но могут быть данные без имени или адреса, телефона и т.д. То есть отсутствовать в одном из массивов. Или например одна контора платеж провела и занесла в массив, а вторая уже домой ушла и занесет только завтра. Тогда в одном из многомерных массивов, может не быть целого массива. В таком случае можно сделать чтобы левый столбец был заполнен, а правый "Не найдено". Как-то так...
Тут вы близки к решению, но все равно не то. А я не знаком со многими элементами вашей функции. Может вы могли бы ее расписать?
Ключи в массиве есть всегда. Если они явно не указаны, то это просто числа 0, 1, ... Т.е. если у вас вместо ассоциативного массива: PHP: $mass = [ [ 'addr' => 'Адрес1', 'fio' => 'Иванов Иван Иванович', 'tel' => '223322223322', 'date' => '05-Jan-23 9:24', 'sum' => 322 ], [ 'addr' => 'Адрес2', 'fio' => 'Иванов Иван Иванович', 'tel' => '223322223322', 'date' => '15-Feb-22 19:12', 'sum' => 1000 ], ]; будет массив: PHP: $mass = [ ['Адрес1', 'Иванов Иван Иванович', '223322223322', '05-Jan-23 9:24', 322], ['Адрес2', 'Иванов Иван Иванович', '223322223322', '15-Feb-22 19:12', 1000], ]; Ничего не изменится. Только вместо ключей 'addr', 'fio', 'tel', 'date', 'sum' будут индексы 0, 1, 2, 3, 4 соответственно. См пример в песочнице: https://extendsclass.com/php-bin/5834e3c PHP: //функция arr_search() получает в качестве аргументов многомерный массив $arr, имя поля/индекс массива, по которому будет происходить поиск и значение, которое в этом поле ищем. function arr_search($arr, $field, $value){ //получаем массив номеров строк $keys[], в которых в указанном поле $field лежит заданное значение $value $keys = array_keys(array_column($arr, $field), $value); //далее печатаем в цикле строки, согласно найденным номерам foreach($keys as $key){ //каждую выводимую строку складываем в буферную строку $res $res = ''; //добавляем в строку $res все значения полей каждой строки foreach($arr[$key] as $name => $value){ //значения полей заключаем в квадратные скобки (для наглядности) $value = "[$value]"; //подсвечиваем красным значение поля, если его имя совпадает с тем, по которому проводился поиск $res .= ($name == $field) ? '<span class="search">' . $value . '</span>' : $value; //после значений полей ставим запятые, кроме последнего (индекс 4 или поле 'sum') if ($name != 4){ $res .= ', '; } } //по завершении цикла, выводим строку на экран echo $res, "<br>\n"; } } --- Добавлено --- Мой пример не решение, а только его небольшая часть. Судя по вашему описанию, далее нужно произвести выборку всех возможных значений каждого поля и во вложенном цикле провести последовательный поиск по ним с помощью выше приведенной функции. Попробуйте это сделать сами.
Это я уже понял. Сразу просто не въехал, написал а потом врубился. Но написанного топором не вырубишь Спасибо, что подробно расписали. Многое все равно остается не понятным из-за не знания синтаксиса, но с этим теперь попробую поработать дальше. Я не прощаюсь