Не могу заставить in_array работать

В моем магазине woocommerce разные способы доставки. Поэтому я хочу отправлять индивидуальные электронные письма «Заказ выполнен». Один из способов доставки: Bezorgen

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

function llv_delivery_notes(){

    $order_id = get_the_id();

    global $wpdb;
    $result = $wpdb->get_results ( "SELECT * FROM llv_woocommerce_order_items 
                WHERE order_id = $order_id;" );
?>

<pre>
   <?php print_r($result);?>
</pre>

<?php

    if (in_array("Bezorgen", $result)){
       echo "This looks good";
    } else {
       echo "There is still something wrong here";
    }
}

Что бы я ни попробовал, эта функция возвращает false. Как вы можете видеть ниже, значение Bezorgen действительно существует в массиве. Что здесь не так ....

  Array
(
[0] => stdClass Object
    (
        [order_item_id] => 160
        [order_item_name] => Test pakket met koteletten en rollade
        [order_item_type] => line_item
        [order_id] => 448
    )

[1] => stdClass Object
    (
        [order_item_id] => 161
        [order_item_name] => Lekker sappig koteletje geweldig op de barbeque (4 stuks)
        [order_item_type] => line_item
        [order_id] => 448
    )

[2] => stdClass Object
    (
        [order_item_id] => 162
        [order_item_name] => Rollade
        [order_item_type] => line_item
        [order_id] => 448
    )

[3] => stdClass Object
    (
        [order_item_id] => 163
        [order_item_name] => Bezorgen
        [order_item_type] => shipping
        [order_id] => 448
    )

[4] => stdClass Object
    (
        [order_item_id] => 164
        [order_item_name] => NL-BTW 6%-1
        [order_item_type] => tax
        [order_id] => 448
    )

[5] => stdClass Object
    (
        [order_item_id] => 165
        [order_item_name] => wc_points_redemption_2_2018_03_19_12_33
        [order_item_type] => coupon
        [order_id] => 448
    )

)

Это не массивы, это объекты. У вас есть массив объектов. Без клавиш (числовых).

delboy1978uk 23.04.2018 15:16

Сам массив его не содержит. Он содержит объект, имеющий это как свойство. Вам нужно пройти через массив, чтобы проверить, имеет ли объект свойство order_item_name, установленное на Bezorgen.

user5147563 23.04.2018 15:17
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
2
164
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

in_array работает только с одномерным массивом, например:

$array = ["cars", "planes", "trains"]; // in_array("cars", $array) -- true

Чтобы проверить, существует ли значение в многомерном массиве, вы должны сделать это так:

foreach($result as $value)
{
    if (in_array("bezorgen", $value))
    {
        echo "Bezorgen exists";
    }
}

Или создайте свой собственная функция:

function in_array_recursive($needle, $haystack, $strict = false) {
    foreach ($haystack as $item) {
        if (($strict ? $item === $needle : $item == $needle) || (is_array($item) && in_array_r($needle, $item, $strict))) {
            return true;
        }
    }

    return false;
}

И используйте это так:

in_array_recursive("bezorgen", $result);

$result - это массив объектов, а не массив string.

foreach($result as $order_item) {
   if ($order_item->order_item_name === "Bezorgen") {
      echo "This looks good";
   }
}

in_array () ищет массив ключ. Например:

$people = array("Peter", "Joe", "Glenn", "Cleveland");

а потом:

in_array("Peter", $peolple);

Значение, которое вы ищете, не является ключом (это свойство объекта внутри массива).

Думаю, вы можете попробовать что-то вроде этого:

$founded = false;
foreach($result as $value){
    if ($value->order_item_name == 'Bezorgen') $founded = true;
}

if ($founded){
    echo "This looks good";
} else {
    echo "There is still something wrong here";
}

Ваш запрос возвращает массив объектов в качестве результата. Вам нужно выполнить цикл по каждому объекту, чтобы проверить, существует ли ваше значение.

Вы можете попробовать, как показано ниже:

$looksGood = false;
foreach($result as $key => $obj) {
    if (isset($obj->order_item_name) && ($obj->order_item_name === "Bezorgen") {
        $looksGood = true;
    }
}

echo ($looksGood) ? "This looks good" : "There is still something wrong here";

Надеюсь, что смогу помочь :)

Ответ принят как подходящий

Вы можете использовать array_column() для извлечения данных только для столбца order_item_name ...

if (in_array("Bezorgen", array_column($result, 'order_item_name'))){
   echo "This looks good";
} else {
   echo "There is still something wrong here";
}

Это отлично работает! Спасибо! Его также легко расширить с помощью других моих способов доставки!

A3O 23.04.2018 16:18

Другие вопросы по теме