explode()期望参数2为字符串,给定数组

时间:2018-09-26 14:26:40

标签: php arrays explode

我在下面的代码中设计了我正在使用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;
            }
        }

    }


}

4 个答案:

答案 0 :(得分:1)

您的条件:

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

可以返回带有数组的true

最好使用这样的东西: if (isset($json->clientip) && is_string($json->clientip))

答案 1 :(得分:0)

正好告诉您,

“ 10.74.10.1”,“ 10.75.10.132”是一个数组。爆炸需要一个字符串,因为它基于分隔符,

创建一个数组

在$ json-> clientip上尝试使用var_dump()看看它是什么样,您可能需要在这里重新编写代码。

答案 2 :(得分:0)

函数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的来源,以确保在没有收到数组的情况下采用正确的方法。

答案 3 :(得分:0)

我可以提出一种可能性吗?我会检查两种可能的情况。如果数组执行一种方式,如果字符串执行爆炸。

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