【问题标题】:explode() expects parameter 2 to be string, array givenexplode() 期望参数 2 是字符串,给定数组
【发布时间】:2018-09-26 14:26:39
【问题描述】:

我设计了下面的代码,我使用爆炸来爆炸数据,

"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" 不是字符串,因此您无法将其分解。它是一个数组的 2 个元素。因此你得到的错误。在您的情况下,您可以将 foreach 中的 $tmp 替换为 $json->clientip,它应该可以工作。
  • 看起来 clientip 已经是一个数组了。做一个var_dump($json->clientip)
  • 取自 cmets 的答案:"preg_match() 期望参数 2 为字符串,数组在“ 中给出 - 嗯....that 在哪里i> 功能?
  • 这是我的 validatePattern 函数 private static function _validatePattern($pattern, $value) { $validity = false; $validity = preg_match($pattern, $value);返回$有效性; }

标签: php arrays explode


【解决方案1】:

你的条件:

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

可以用数组返回true

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

【讨论】:

  • 现在我收到这个错误:preg_match() 期望参数 2 是字符串,数组中给出..
【解决方案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 函数中的值。由于我们不知道那里发生了什么,因此很难理解错误。但我可以告诉你的是,你向 validate 函数发送了一个字符串值,这取决于以后对它的期望。
  • 这是函数:私有静态函数 _validatePattern($pattern, $value) { $validity = false; $validity = preg_match($pattern, $value);返回$有效性; }
  • 你的 $requestObj 对象之前在代码中定义了吗?这可能会返回错误并阻止进一步执行。刚刚测试了一个本地 sn-p 并且效果很好:code function _validatePattern($pattern, $value) { $validity = false; $validity = preg_match($pattern, $value);返回$有效性; } $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
【解决方案3】:

正如它告诉你的那样,

"10.74.10.1", "10.75.10.132" 是一个数组。 Explode 需要一个字符串,因为它基于分隔符 , 创建一个数组

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

【讨论】:

    【解决方案4】:

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

    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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-12-14
      • 2017-08-30
      • 1970-01-01
      • 1970-01-01
      • 2016-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-02
      相关资源
      最近更新 更多