Я разработал код ниже, в котором я использую взрыв, чтобы взорвать данные ниже,
"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;
}
}
}
}
похоже, что clientip уже является массивом. Сделайте var_dump($json->clientip)
Взято из комментариев в ответах: "preg_match () ожидает, что параметр 2 будет строкой, массив задан в" - Ммм .... где функция что?
Это моя частная статическая функция validatePattern _validatePattern ($ pattern, $ value) {$ validity = false; $ validity = preg_match ($ шаблон, $ значение); вернуть действительность $; }






Точно так, как он вам говорит,
«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 будет строкой, массивом, заданным в ..
Функция 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"]
замените foreach ($ json-> clientip as $ key => $ ipValue) на foreach ($ json-> clientip as $ ipValue)
Я предполагаю, что вы preg_match () значение в функции validatePattern. Поскольку мы не знаем, что там происходит, понять ошибку сложно. Но я могу вам сказать, что вы отправляете строковое значение в функцию проверки, это зависит от того, что от нее ожидается позже.
Это функция: частная статическая функция _validatePattern ($ pattern, $ value) {$ validity = false; $ validity = preg_match ($ шаблон, $ значение); вернуть действительность $; }
Определен ли ваш объект $ 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
Большое спасибо. Я дважды определял $ requestObj для clientip. Теперь все работает нормально
Отлично, я рад, что вы разобрались.
Могу я предложить возможность? Я бы проверил оба возможных случая. Если массив выполняется в одну сторону, если строка выполняет ваш 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 может быть маршаллером
"10.74.10.1", "10.75.10.132"- это не струна, поэтому ее нельзя взорвать. Это 2 элемента массива. Следовательно, вы получаете ошибку. В вашей ситуации вы можете просто заменить$tmpв своем foreach на$json->clientip, и он должен работать.