Php explode()要求参数2为字符串,数组给定
我设计了下面的代码,我使用explode在数据下面进行分解Php explode()要求参数2为字符串,数组给定,php,arrays,explode,Php,Arrays,Explode,我设计了下面的代码,我使用explode在数据下面进行分解 "10.74.10.1", "10.75.10.132" 然而,我得到下面的错误 explode()要求参数2为字符串,数组在..行中给出 有人能告诉我我的密码有什么问题吗 这是我的完整代码: public function pagesviewlogsAction() { // Checks authorization $this->acl->doCheck($this); --
"10.74.10.1", "10.75.10.132"
然而,我得到下面的错误
explode()要求参数2为字符串,数组在..行中给出
有人能告诉我我的密码有什么问题吗
这是我的完整代码:
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)
可以使用数组返回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
}
此外,我还建议检查封送处理程序,以帮助您解析代码中的逻辑,从而使代码更加整洁,而不是将其放在同一个位置。因此,在我看来,您的Utils::validatePattern可能是封送器。
“10.74.10.1”、“10.75.10.132”
不是字符串,因此您不能分解它。它是一个数组的两个元素。因此你会得到错误。在您的情况下,您可以用$json->clientip
替换foreach中的$tmp
,它应该可以工作。看起来clientip已经是一个数组了。执行一个var\u dump($json->clientip)
从答案中的注释中获取:“preg\u match()期望参数2是字符串,数组以“-Umm…”形式给出。。。。那个函数在哪里?这是我的validatePattern函数私有静态函数_validatePattern($pattern,$value){$validity=false;$validity=preg_match($pattern,$value);return$validity;}现在我得到了这个错误:preg_match()期望参数2是字符串,数组在..中给出,现在我得到了这个错误:preg_match()期望参数2是字符串,数组在..中给出。。这里,$json->clientip=[“10.74.10.1”,“10.75.10.132”]将foreach($json->clientip as$key=>$ipValue)替换为foreach($json->clientip as$ipValue),我假设您在validatePattern函数中预先设置了match()值。因为我们不知道那里发生了什么,所以很难理解错误。但我可以告诉您的是,您向validate函数发送一个字符串值,这取决于以后对它的期望。这是一个函数:私有静态函数_validatePattern($pattern,$value){$validation=false;$validation=preg_match($pattern,$value);return$validation;}您的$requestObj对象以前在代码中定义过吗?这可能会返回错误并阻止进一步执行。刚刚测试了一个本地代码段,效果非常好:code
function\u validatePattern($pattern,$value){$validation=false;$validation=preg\u match($pattern,$value);return$validation;}$aa=[“10.74.10.1”,“10.75.10.132”]$uu=数组();如果(is_array($aa)){foreach($aa as$ipValue){$uu[]=(_validatePattern(“/^\d{1,3}.\d{1,3}.\d{1,3}.$/”,((trim($ipValue))?FALSE))?trim($ipValue):NULL;}print\r($uu)<代码>代码