Php explode()要求参数2为字符串,数组给定

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); --

我设计了下面的代码,我使用explode在数据下面进行分解

"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)<代码>代码