Explode () ожидает, что параметр 2 будет строкой, заданным массивом

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

"10.74.10.1", "10.75.10.132"

однако я получаю ошибку ниже

"explode() expects parameter 2 to be string, array given in line.."

Может кто-нибудь подсказать, что не так в моем коде.

Это мой полный код:

public function pagesviewlogsAction()
    {
        // Checks authorization
        $this->acl->doCheck($this);

-- language: lang-html -->      // Validates request
        $requestObj = new PagesviewlogEventRequest();

$requestObj->userid = (Utils::validatePattern(Utils::REGEXP_SECLOGS_USERID, (($json->userid) ?? FALSE) )) ? $json->userid:NULL;
                $requestObj->clientip = array();
                //if (isset($json->clientip) && $json->clientip != '' && $json->clientip != NULL) {
                if (isset($json->clientip) && is_string($json->clientip)){
                    $tmp = explode(',', $json->clientip);                   
                    foreach ($tmp as $key => $ipValue) {
                        $requestObj->clientip[] = (Utils::validatePattern(Utils::REGEXP_SECLOGS_IP, ((trim($ipValue)) ?? FALSE) )) ? trim($ipValue):NULL;
                    }
                }

        }


        foreach (get_object_vars($requestObj) as $key => $value) {
            switch ($key) {
                case 'clientip':
                    // ...
                    break;

                default:
                   // Other cases
                    if ($value === FALSE) {
                        return new JsonModel([
                            'status' => 'FAILED',
                            'errorField' => $key,
                            'message'=> 'Parameters "' . $key . '" is missing or invalid.',
                            'data' => NULL
                        ]);
                    }
                    break;
            }
        }

    }


}
"10.74.10.1", "10.75.10.132" - это не струна, поэтому ее нельзя взорвать. Это 2 элемента массива. Следовательно, вы получаете ошибку. В вашей ситуации вы можете просто заменить $tmp в своем foreach на $json->clientip, и он должен работать.
Dirk Scholten 26.09.2018 16:29

похоже, что clientip уже является массивом. Сделайте var_dump($json->clientip)

Jeff 26.09.2018 16:29

Взято из комментариев в ответах: "preg_match () ожидает, что параметр 2 будет строкой, массив задан в" - Ммм .... где функция что?

Funk Forty Niner 26.09.2018 16:51

Это моя частная статическая функция validatePattern _validatePattern ($ pattern, $ value) {$ validity = false; $ validity = preg_match ($ шаблон, $ значение); вернуть действительность $; }

ssnone 26.09.2018 16:56
Стоит ли изучать 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 и хотите разрабатывать...
2
4
5 374
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Точно так, как он вам говорит,

«10.74.10.1», «10.75.10.132» - это массив. Для Explode требуется строка, потому что он создает массив на основе разделителя ,.

Попробуйте использовать var_dump () в своей $ json-> clientip и посмотрите, как это выглядит. Возможно, вам придется немного переделать свой код здесь.

Ваше условие:

if (isset($json->clientip) && $json->clientip != '' && $json->clientip != NULL)

может вернуть true с массивом.

лучше использовать что-то вроде этого: if (isset($json->clientip) && is_string($json->clientip))

Теперь я получаю эту ошибку: preg_match () ожидает, что параметр 2 будет строкой, массивом, заданным в ..

ssnone 26.09.2018 16:40
Ответ принят как подходящий

Функция explode () преобразует строку в массив с использованием заданного разделителя, в вашем случае "," Поскольку $ json-> clientip уже является массивом, простое (не лучшее) решение - изменить код на:

    $requestObj->clientip = array();
    if (is_array($json->clientip)) {

        foreach ($json->clientip as $key => $ipValue) {
            $requestObj->clientip[] = (Utils::validatePattern(Utils::REGEXP_SECLOGS_IP, ((trim($ipValue)) ?? FALSE) )) ? trim($ipValue):NULL;
        }
    } else {
//handle the other option here. like string or object
}

и это зависит от источника $ json-> clientip, чтобы убедиться, что у вас есть правильный подход, если вы не получили массив.

Теперь я получаю эту ошибку: preg_match () ожидает, что параметр 2 будет строкой, массивом, указанным в .. Здесь $ json-> clientip = ["10.74.10.1", "10.75.10.132"]

ssnone 26.09.2018 16:47

замените foreach ($ json-> clientip as $ key => $ ipValue) на foreach ($ json-> clientip as $ ipValue)

MicPic 26.09.2018 16:50

Я предполагаю, что вы preg_match () значение в функции validatePattern. Поскольку мы не знаем, что там происходит, понять ошибку сложно. Но я могу вам сказать, что вы отправляете строковое значение в функцию проверки, это зависит от того, что от нее ожидается позже.

MicPic 26.09.2018 17:06

Это функция: частная статическая функция _validatePattern ($ pattern, $ value) {$ validity = false; $ validity = preg_match ($ шаблон, $ значение); вернуть действительность $; }

ssnone 26.09.2018 17:07

Определен ли ваш объект $ requestObj ранее в коде? Это может вернуть ошибку и помешать дальнейшему выполнению. только что протестировал локальный фрагмент и отлично работает: code function _validatePattern ($ pattern, $ value) {$ validity = false; $ validity = preg_match ($ шаблон, $ значение); вернуть действительность $; } $ aa = ["10.74.10.1", "10.75.10.132"]; $ uu = массив (); if (is_array ($ aa)) {foreach ($ aa as $ ipValue) {$ uu [] = (_validatePattern ("/ ^ \ d {1,3}. \ d {1,3}. \ d {1, 3}. \ D {1,3} $ / ", ((trim ($ ipValue)) ?? FALSE)))? обрезать ($ ipValue): NULL; }} print_r ($ uu); code

MicPic 26.09.2018 17:13

Большое спасибо. Я дважды определял $ requestObj для clientip. Теперь все работает нормально

ssnone 26.09.2018 17:37

Отлично, я рад, что вы разобрались.

MicPic 26.09.2018 17:41

Могу я предложить возможность? Я бы проверил оба возможных случая. Если массив выполняется в одну сторону, если строка выполняет ваш explode.

if (!isset($json->clientip)) {
    // thow exception or return call
}

$requestObj->clientip = [];

if (is_array($json->clientip)) {
  array_walk($json->clientip, function($ipValue) use(&$requestObj) {
    $ipValue = trim($ipValue);
    $requestObj->clientip[] = (Utils::validatePattern(Utils::REGEXP_SECLOGS_IP, (($ipValue) ?? FALSE) )) ? $ipValue:NULL;
  });
} else if (is_string($json->clientip)) {
   // execute your explode
}

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

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