За последние 24 часа нас посетили 22818 программистов и 1242 робота. Сейчас ищут 747 программистов ...

foreach: Получение данных из массива

Тема в разделе "PHP для новичков", создана пользователем Moor, 1 мар 2020.

  1. Moor

    Moor Новичок

    С нами с:
    1 мар 2020
    Сообщения:
    23
    Симпатии:
    0
    Адрес:
    Latvia
    Привет! Я очень-очень начинающий, постигаю азы на ходу. Не стесняйтесь меня поправить, если я буду пользоваться неверной терминологией.

    Задача: найти в JSON все ноды, где parent_id == 'email', и из них получить значения id и label. Перебирать ВСЁ foreach я умею, а вот перебрать только определённые пока не научился. Пример JSON ниже:
    Код (Text):
    1. [
    2. {
    3.     "id": "email_new_order",
    4.     "label": "Новый заказ",
    5.     "description": "Письма с деталями заказов отправляются по списку получателей в момент приёма новых заказов.",
    6.     "parent_id": "email",
    7.     "sub_groups": [],
    8.     "_links": {
    9.       "options": [
    10.         {
    11.           "href": "https:\/\/my.domain\/wp-json\/wc\/v3\/settings\/email_new_order"
    12.         }
    13.       ]
    14.     }
    15.   },
    16.   {
    17.     "id": "email_cancelled_order",
    18.     "label": "Отменённый заказ",
    19.     "description": "Письма об отмене заказов отправляются по списку получателей в момент присвоения заказам статуса Отменённых (если до этого они были в режиме удержания).",
    20.     "parent_id": "email",
    21.     "sub_groups": [],
    22.     "_links": {
    23.       "options": [
    24.         {
    25.           "href": "https:\/\/my.domain\/wp-json\/wc\/v3\/settings\/email_cancelled_order"
    26.         }
    27.       ]
    28.     }
    29.   }
    30. ]
     
  2. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.555
    Симпатии:
    1.754
    Перебираешь все, и ставишь условие, к примеру. Найденное складываешь в новый массив.

    Или array_filter, которая тоже самое сделает за тебя, но я не знаю, насколько ты знаком с типом callable, ну и самому на начальных этапах написать полезно.
     
    #2 mkramer, 1 мар 2020
    Последнее редактирование: 1 мар 2020
    Moor нравится это.
  3. Moor

    Moor Новичок

    С нами с:
    1 мар 2020
    Сообщения:
    23
    Симпатии:
    0
    Адрес:
    Latvia
    Ни на сколько пока. Теории я пока в принципе не знаю, приходится в экстренных уловиях осваивать. Но как только допишу то, что пишу, пойду читать про callable и изучать, как работает array_filter.
    Был в 30 секундах до именно такой реализации, когда прочел ответ :) Получилось. Вот код, может, кому пригодится:
    PHP:
    1.     foreach ($wc_settings as $value) {
    2.         $wc_email_parent_id = $value->parent_id;
    3.         $wc_email_label = $value->label;
    4.         $wc_email_id = $value->id;
    5.         if ($wc_email_parent_id == 'email') {
    6.             echo $wc_email_id . ' → ' . $wc_email_label;
    7.         }
    8.     }
    Спасибо!
     
  4. Artur_hopf

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

    С нами с:
    7 май 2018
    Сообщения:
    2.266
    Симпатии:
    405
    Вот так можно
    PHP:
    1. array_map(function($k) {
    2.     if($k->parent_id == 'email')
    3.     echo $k->id . ' → ' . $k->label;
    4. }, $wc_settings);
     
    Moor нравится это.
  5. Moor

    Moor Новичок

    С нами с:
    1 мар 2020
    Сообщения:
    23
    Симпатии:
    0
    Адрес:
    Latvia
    @Artur_hopf, спасибо, взял на вооружение!
     
  6. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.555
    Симпатии:
    1.754
    @Artur_hopf, тогда array_walk лучше
    @Moor, вот это и есть тип callable
     
    Moor нравится это.
  7. Moor

    Moor Новичок

    С нами с:
    1 мар 2020
    Сообщения:
    23
    Симпатии:
    0
    Адрес:
    Latvia
    Я перед сном почитал про callable, понял :)
    Получается, что я таким образом могу в одной функции создать множество переменных из массива и потом ими пользоваться из функции? Потому что сейчас я их собираю так:
    PHP:
    1. if($_GET['id'] != 0){
    2.     $order = $woocommerce->get('orders/'.$_GET['id']);
    3.     $order_id                    = $order->id;
    4.     $order_total                = $order->total;
    5.     $order_customer_id            = $order->customer_id;
    6.     $order_status                = $order->status;
    7.     $order_customer_note        = $order->customer_note;
    8.     $order_billing_first_name    = $order->billing->first_name;
    9.     $order_billing_last_name    = $order->billing->last_name;
    10.     $order_billing_company        = $order->billing->company;
    11.     $order_billing_address_1    = $order->billing->address_1;
    12.     $order_billing_address_2    = $order->billing->address_2;
    13.     $order_billing_city            = $order->billing->city;
    14.     …
    15. }
    Я не знаю, как правильнее и почему. И при этом не понимаю, как сформулировать вопрос гуглу, чтобы получить ответ :)
     
  8. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.555
    Симпатии:
    1.754
    Не въехал, вы о чём
     
  9. Moor

    Moor Новичок

    С нами с:
    1 мар 2020
    Сообщения:
    23
    Симпатии:
    0
    Адрес:
    Latvia
    Извините, я преждевременно задал вопрос, надо было сначала внимательно почитать про array_map и array_walk.
     
  10. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.752
    Симпатии:
    1.322
    Адрес:
    Лень
    Конструируешь undefined переменные, если !:
    false
    --- Добавлено ---
    хочу чтобы пхп форматировал жесткий диск за глупую валидацию переменных