За последние 24 часа нас посетили 17552 программиста и 1310 роботов. Сейчас ищут 1049 программистов ...

Несколько элементов из массивов

Тема в разделе "PHP для новичков", создана пользователем CyberWolf, 29 дек 2022.

  1. CyberWolf

    CyberWolf Активный пользователь

    С нами с:
    1 окт 2014
    Сообщения:
    22
    Симпатии:
    0
    Всем привет
    Подскажите пожалуйста, как из многомерного массива вывести несколько элементов, причем из нескольких массивов. Например, из каждого массива мне надо вывести 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, ...],
    ...
    ];
     
  2. Drunkenmunky

    Drunkenmunky Активный пользователь

    С нами с:
    12 авг 2020
    Сообщения:
    1.480
    Симпатии:
    281
  3. CyberWolf

    CyberWolf Активный пользователь

    С нами с:
    1 окт 2014
    Сообщения:
    22
    Симпатии:
    0
    Если я правильно понимаю, у вас немного не то что мне надо...
    У вас получился одномерный массив. У меня же получается следующая конструкция:

    $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" чтобы вывести их или сделать другие манипуляции.
     
  4. rr33rr

    rr33rr Активный пользователь

    С нами с:
    6 май 2021
    Сообщения:
    35
    Симпатии:
    18
    Что значит "взять например "a" и "d" чтобы вывести их"?
    Вывести первый и четвертый элементы всех массивов?
    Тогда так:
    PHP:
    1. <?php
    2. $mymass = [
    3.   ["a1", "b1", "c1", "d1"],
    4.   ["a2", "b2", "c2", "d2"],
    5.   ["a3", "b3", "c3", "d3"],
    6.   ["a4", "b4", "c4", "d4"],
    7. ];
    8. foreach($mymass as $arr){
    9.   echo "a=", $arr[0], " d=", $arr[3], "\n";
    10. }
    11. ?>
    12. /*
    13. a=a1 d=d1
    14. a=a2 d=d2
    15. a=a3 d=d3
    16. a=a4 d=d4
    17. */
     
  5. Drunkenmunky

    Drunkenmunky Активный пользователь

    С нами с:
    12 авг 2020
    Сообщения:
    1.480
    Симпатии:
    281
    Нет.
     
  6. CyberWolf

    CyberWolf Активный пользователь

    С нами с:
    1 окт 2014
    Сообщения:
    22
    Симпатии:
    0
    Супер! Спасибо, получилось.
    Теперь задача усложняется... Есть еще один многомерный массив, например $mymass2. В нем тоже находятся массивы с данными, как в $mymass. Причем в массивах, многомерных массивов $mymass и $mymass2, данные как строчные, так и цифирные, а есть совсем пустые. Мне надо находить одинаковые элементы в массивах, этих двух многомерных массивов. Но как валидатно это записать не знаю...
     
  7. rr33rr

    rr33rr Активный пользователь

    С нами с:
    6 май 2021
    Сообщения:
    35
    Симпатии:
    18
    Пример в студию. Массивов и того, что в них искать. А так же, как должен выглядеть вывод результатов поиска.
     
  8. CyberWolf

    CyberWolf Активный пользователь

    С нами с:
    1 окт 2014
    Сообщения:
    22
    Симпатии:
    0
    Будет сложно объяснить... Ну например, есть два многомерных массива $mymass и $mymass2, это я уже говорил. В них есть массивы с данными о сделанных покупках. В этих данных адреса магазинов, ФИО клиента, телефон, дата покупки, сумма покупки и т.д. Данные из массивов много мерных массивов $mymass и $mymass2, могут отличаться (где-то больше, где-то меньше, где-то вообще отсутствует ФИО но есть адрес). Так как собраны разными конторами.

    Задача сделать так, чтобы в автоматическом режиме, из $mymass и $mymass2, находились похожие данные и выводились на экран. Например поиск по дате, адресу магазина, ФИО и оплаченной сумме. Но как сказал выше, чего-то может не быть в одном из массивов. Это надо для сверки поступивших денег за товары.
     
  9. rr33rr

    rr33rr Активный пользователь

    С нами с:
    6 май 2021
    Сообщения:
    35
    Симпатии:
    18
    Тогда будет сложно ответить.

    Что в вашем понимании "похожие данные"?
    Что и как должно выводиться на экран?

    Искать в многомерном массиве строки с одинаковыми значениями полей можно как-то так (На примере поиска в адресах (поле 'addr') значения 'Адрес2'):
    PHP:
    1. <style>
    2.   .search{
    3.     color: red;
    4.   }
    5. </style>
    6. <?php
    7. $mass1 = [
    8.   [
    9.    'addr' => 'Адрес1',
    10.    'fio' => 'Иванов Иван Иванович',
    11.    'tel' => '223322223322',
    12.    'date' => '05-Jan-23 9:24',
    13.    'sum' => 322
    14.   ],
    15.   [
    16.    'addr' => 'Адрес2',
    17.    'fio' => 'Иванов Иван Иванович',
    18.    'tel' => '223322223322',
    19.    'date' => '15-Feb-22 19:12',
    20.    'sum' => 1000
    21.   ],
    22.   [
    23.    'addr' => 'Адрес1',
    24.    'fio' => 'Петров Петр',
    25.    'tel' => '',
    26.    'date' => '09-Dec-22 7:40',
    27.    'sum' => 30122
    28.   ],
    29.   [
    30.    'addr' => 'Адрес3',
    31.    'fio' => 'Сидоров Иван',
    32.    'tel' => '',
    33.    'date' => '24-Aug-22 17:44',
    34.    'sum' => 30122
    35.   ],
    36. ];
    37. $mass2 = [
    38.   [
    39.    'addr' => 'Адрес1',
    40.    'fio' => 'Иванов Иван Иванович',
    41.    'tel' => '223322223322',
    42.    'date' => '05-Jan-23 9:24',
    43.    'sum' => 322
    44.   ],
    45.   [
    46.    'addr' => 'Адрес2',
    47.    'fio' => 'Иванов Иван Иванович',
    48.    'tel' => '223322223322',
    49.    'date' => '01-Jan-23 9:24',
    50.    'sum' => 322
    51.   ],
    52.   [
    53.    'addr' => 'Адрес2',
    54.    'fio' => 'Иванов Иван Иванович',
    55.    'tel' => '223322223322',
    56.    'date' => '15-Feb-22 19:12',
    57.    'sum' => 1000
    58.   ],
    59.   [
    60.    'addr' => 'Адрес1',
    61.    'fio' => 'Петров Петр',
    62.    'tel' => '',
    63.    'date' => '09-Dec-22 7:40',
    64.    'sum' => 30122
    65.   ],
    66.   [
    67.    'addr' => 'Адрес3',
    68.    'fio' => 'Сидоров Иван',
    69.    'tel' => '',
    70.    'date' => '24-Aug-22 17:44',
    71.    'sum' => 15026
    72.   ],
    73.   [
    74.    'addr' => 'Адрес2',
    75.    'fio' => 'Сидоров Сидор Сидорович',
    76.    'tel' => '',
    77.    'date' => '12-Jul-22 12:18',
    78.    'sum' => 22
    79.   ],
    80. ];
    81.  
    82. function arr_search($arr, $field, $value){
    83.   $keys = array_keys(array_column($arr, $field), $value);
    84.   foreach($keys as $key){
    85.     $res = '';
    86.     foreach($arr[$key] as $name => $value){
    87.       $value = "[$value]";
    88.       $res .= ($name == $field) ? '<span class="search">' . $value . '</span>' : $value;
    89.       if ($name != 'sum'){
    90.         $res .= ', ';
    91.       }
    92.     }
    93.     echo $res, "<br>\n";
    94.   }
    95. }
    96.  
    97. //На примере поиска в адресах (поле 'addr') значения 'Адрес2'
    98. echo "<h3>Поиск в первом массиве:</h3>\n";
    99. arr_search($mass1, 'addr', 'Адрес2');
    100. echo "<h3>Поиск во втором массиве:</h3>\n";
    101. arr_search($mass2, 'addr', 'Адрес2');
    102. ?>
    Этот пример в песочнице: https://extendsclass.com/php-bin/7195105

    Автоматический перебор всех возможных полей и их совпадающих значений, а так же, как должен выглядеть вывод всего этого "безобразия", попробуйте реализовать сами.
    Когда можете лучше объяснить задачу. Хотя бы себе. )

    Грамотно сформулированная задача = половина решения.
     
  10. CyberWolf

    CyberWolf Активный пользователь

    С нами с:
    1 окт 2014
    Сообщения:
    22
    Симпатии:
    0
    В целом ваш пример очень хорош. Единственное только в моей задаче нету ключей. То есть, у меня есть многомерный массив, с массивами, в которых данные в определенном порядке. Например сначала дата, затем имя, адрес, телефон, сумма и т.д. И вот надо, чтобы из двух многомерных массивов шел поиск на похожие данные.

    Пример: Идет сначала поиск по дате (нашел 17 одинаковых дат) - Пошел поиск по имени (из 17 найденных по дате 3 совпадения по ФИО) - далее адрес совпал и телефон - проверяем сумму покупки (человек делал 3 разные покупки в одну дату) - Выводим все на экран в два столбца, например левый столбец из одного многомерного массива, правый столбец из другого.

    Но могут быть данные без имени или адреса, телефона и т.д. То есть отсутствовать в одном из массивов. Или например одна контора платеж провела и занесла в массив, а вторая уже домой ушла и занесет только завтра. Тогда в одном из многомерных массивов, может не быть целого массива. В таком случае можно сделать чтобы левый столбец был заполнен, а правый "Не найдено".

    Как-то так...
     
  11. CyberWolf

    CyberWolf Активный пользователь

    С нами с:
    1 окт 2014
    Сообщения:
    22
    Симпатии:
    0
    Тут вы близки к решению, но все равно не то. А я не знаком со многими элементами вашей функции. Может вы могли бы ее расписать?
     
  12. rr33rr

    rr33rr Активный пользователь

    С нами с:
    6 май 2021
    Сообщения:
    35
    Симпатии:
    18
    Ключи в массиве есть всегда. Если они явно не указаны, то это просто числа 0, 1, ...
    Т.е. если у вас вместо ассоциативного массива:
    PHP:
    1. $mass = [
    2.   [
    3.    'addr' => 'Адрес1',
    4.    'fio' => 'Иванов Иван Иванович',
    5.    'tel' => '223322223322',
    6.    'date' => '05-Jan-23 9:24',
    7.    'sum' => 322
    8.   ],
    9.   [
    10.    'addr' => 'Адрес2',
    11.    'fio' => 'Иванов Иван Иванович',
    12.    'tel' => '223322223322',
    13.    'date' => '15-Feb-22 19:12',
    14.    'sum' => 1000
    15.   ],
    16. ];
    будет массив:
    PHP:
    1. $mass = [
    2.   ['Адрес1', 'Иванов Иван Иванович', '223322223322', '05-Jan-23 9:24', 322],
    3.   ['Адрес2', 'Иванов Иван Иванович', '223322223322', '15-Feb-22 19:12', 1000],
    4. ];
    Ничего не изменится. Только вместо ключей 'addr', 'fio', 'tel', 'date', 'sum' будут индексы 0, 1, 2, 3, 4 соответственно.
    См пример в песочнице: https://extendsclass.com/php-bin/5834e3c

    PHP:
    1. //функция arr_search() получает в качестве аргументов многомерный массив $arr, имя поля/индекс массива, по которому будет происходить поиск и значение, которое в этом поле ищем.
    2. function arr_search($arr, $field, $value){
    3. //получаем массив номеров строк $keys[], в которых в указанном поле $field лежит заданное значение  $value
    4.   $keys = array_keys(array_column($arr, $field), $value);
    5. //далее печатаем в цикле строки, согласно найденным номерам
    6.   foreach($keys as $key){
    7. //каждую выводимую строку складываем в буферную строку $res
    8.     $res = '';
    9. //добавляем в строку $res все значения полей каждой строки
    10.     foreach($arr[$key] as $name => $value){
    11. //значения полей заключаем в квадратные скобки (для наглядности)
    12.       $value = "[$value]";
    13. //подсвечиваем красным значение поля, если его имя совпадает с тем, по которому проводился поиск
    14.       $res .= ($name == $field) ? '<span class="search">' . $value . '</span>' : $value;
    15. //после значений полей ставим запятые, кроме последнего (индекс 4 или поле 'sum')
    16.       if ($name != 4){
    17.         $res .= ', ';
    18.       }
    19.     }
    20. //по завершении цикла, выводим строку на экран
    21.     echo $res, "<br>\n";
    22.   }
    23. }
    --- Добавлено ---
    Мой пример не решение, а только его небольшая часть.
    Судя по вашему описанию, далее нужно произвести выборку всех возможных значений каждого поля и во вложенном цикле провести последовательный поиск по ним с помощью выше приведенной функции.
    Попробуйте это сделать сами.
     
  13. CyberWolf

    CyberWolf Активный пользователь

    С нами с:
    1 окт 2014
    Сообщения:
    22
    Симпатии:
    0
    Это я уже понял. Сразу просто не въехал, написал а потом врубился. Но написанного топором не вырубишь :)

    Спасибо, что подробно расписали. Многое все равно остается не понятным из-за не знания синтаксиса, но с этим теперь попробую поработать дальше. Я не прощаюсь :)