explode() 期望参数 2 为字符串,数组给定
explode() expects parameter 2 to be string, array given
我设计了下面的代码,我使用 explode 来分解下面的数据,
"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"是一个数组。 Explode 需要一个字符串,因为它会根据分隔符 ,
创建一个数组
在您的 $json->clientip 上尝试 var_dump() 并查看它的外观,您可能需要在此处重新编写代码。
您的条件:
if (isset($json->clientip) && $json->clientip != '' && $json->clientip != NULL)
可以 return true
数组。
最好使用这样的东西:
if (isset($json->clientip) && is_string($json->clientip))
函数 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 的来源,以确保您有正确的方法,以防您没有收到数组。
我可以提出一个可能性吗?我会检查这两种可能的情况。如果数组以一种方式执行,如果字符串执行你的爆炸。
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
}
此外,我建议检查 Marshallers,以帮助您解析代码中的逻辑以更整洁地整理它,而不是将它们全部放在同一个地方。所以在我看来你的 Utils::validatePattern 可能是 Marshaller
我设计了下面的代码,我使用 explode 来分解下面的数据,
"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"是一个数组。 Explode 需要一个字符串,因为它会根据分隔符 ,
在您的 $json->clientip 上尝试 var_dump() 并查看它的外观,您可能需要在此处重新编写代码。
您的条件:
if (isset($json->clientip) && $json->clientip != '' && $json->clientip != NULL)
可以 return true
数组。
最好使用这样的东西:
if (isset($json->clientip) && is_string($json->clientip))
函数 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 的来源,以确保您有正确的方法,以防您没有收到数组。
我可以提出一个可能性吗?我会检查这两种可能的情况。如果数组以一种方式执行,如果字符串执行你的爆炸。
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
}
此外,我建议检查 Marshallers,以帮助您解析代码中的逻辑以更整洁地整理它,而不是将它们全部放在同一个地方。所以在我看来你的 Utils::validatePattern 可能是 Marshaller