【问题标题】:Explode function is not working properly爆炸功能无法正常工作
【发布时间】:2017-10-12 12:35:01
【问题描述】:

我正在从正在运行的数据库中获取输出。下面的数组显示正确的输出。

 $get_elements = array(
        'student_elements' => $row->student_elements, 
        'address_elements' => $row->address_elements,  
        'marketing_elements' => $row->marketing_elements, 
        'office_use_elements' => $row->office_use_elements, 
 );

获取输出

Array
(
    [student_elements] => firstname,lastname,mobileno,age,gender
    [address_elements] => building,sector,city
    [marketing_elements] => 
    [office_use_elements] => counsellername,mobile,email
)

现在我在explode函数中传递数组值

$result_elements=explode(',',$get_elements);

遇到错误

Severity: Warning
Message:  explode() expects parameter 2 to be string, array given

我想在 foreach 中传递$result_elements

$results = [];
foreach ($result_elements as $value) {
    echo $sql_elements_get="SELECT fields_name, fields_type FROM `tbl_form_builder_fields` WHERE fields_name='".$value."'";
    $fetch_query = $this->db->query($sql_elements_get);
    foreach ($fetch_query->result() as $r){
        $results[] = $r;
    }
}
return $results;// I

我想每次都运行查询以获取来自explode函数的每个值的输出。

你能帮我解决这个问题吗?

【问题讨论】:

  • 您将一个数组传递给explode。你不能爆炸一个数组。你只能爆炸一个字符串。错误消息告诉你很多。你想explode这个:$row->student_elements,而不是$get_elements
  • @deceze,对,但我通过了 $row->student_elements 然后我得到的输出只有 firstname,lastname,mobileno,age,gender

标签: php arrays codeigniter explode


【解决方案1】:

您似乎正在尝试获取所有字符串中所有唯一元素的列表。正如其他人所提到的,您不能 explode 一个数组。一种循环的方法是将implode 数组放在一起,然后explode 它。

<?php
$get_elements = array (
    'student_elements'     => 'firstname,lastname,mobileno,age,gender',
    'address_elements'     => 'building,sector,city',
    'marketing_elements'     => NULL,
    'office_use_elements'     => 'counsellername,mobile,email'
);

// Combine all strings
$get_elements = implode(',',$get_elements);

// DEBUGGING ONLY
echo $get_elements;

// Split the elements
$get_elements = explode(',', $get_elements);

// DEBUGGING ONLY
echo '<pre>'.var_export($get_elements, TRUE).'</pre>';

// YOUR CODE
$results = [];
foreach ($get_elements as $value) {
    // Ensure it's not empty
    if($value != ''){
        echo $sql_elements_get="SELECT fields_name, fields_type FROM `tbl_form_builder_fields` WHERE fields_name='".$value."'";
        $fetch_query = $this->db->query($sql_elements_get);
        foreach ($fetch_query->result() as $r){
            $results[] = $r;
        }
    }
}
return $results;

?>

用于代码输出的Codepad 链接(删除数据库调用)。

【讨论】:

    【解决方案2】:

    不要运行太多查询;只运行一个。最佳做法是始终尽可能减少查询次数。因为您没有用结果元素区分不同的值,所以只需使用IN 进行一次查询即可。

    $get_elements=[
        'student_elements'=>'firstname,lastname,mobileno,age,gender',
        'address_elements'=>'building,sector,city',
        'marketing_elements'=>'',
        'office_use_elements'=>'counsellername,mobile,email'
    ];
    
    $values="'".str_replace(',',"','",implode(",",array_filter($get_elements,'strlen')))."'";
    
    $fetch_query=$this->db->query("SELECT fields_name, fields_type FROM `tbl_form_builder_fields` WHERE fields_name IN ($values)");
    foreach ($fetch_query->result() as $r){
        $results[] = $r;
    }
    

    *注意,我在用逗号连接之前过滤掉所有空字符串,然后将所有值用单引号括起来。


    为了强调 WHERE 子句中IN 的重要性,区别如下:

    如果没有IN(假设您过滤掉了空元素),您对数据库进行了 11 次调用:

    SELECT fields_name, fields_type FROM `tbl_form_builder_fields` WHERE fields_name='firstname'
    SELECT fields_name, fields_type FROM `tbl_form_builder_fields` WHERE fields_name='lastname'
    SELECT fields_name, fields_type FROM `tbl_form_builder_fields` WHERE fields_name='mobileno'
    SELECT fields_name, fields_type FROM `tbl_form_builder_fields` WHERE fields_name='age'
    SELECT fields_name, fields_type FROM `tbl_form_builder_fields` WHERE fields_name='gender'
    SELECT fields_name, fields_type FROM `tbl_form_builder_fields` WHERE fields_name='building'
    SELECT fields_name, fields_type FROM `tbl_form_builder_fields` WHERE fields_name='sector'
    SELECT fields_name, fields_type FROM `tbl_form_builder_fields` WHERE fields_name='city'
    SELECT fields_name, fields_type FROM `tbl_form_builder_fields` WHERE fields_name='counsellername'
    SELECT fields_name, fields_type FROM `tbl_form_builder_fields` WHERE fields_name='mobile'
    SELECT fields_name, fields_type FROM `tbl_form_builder_fields` WHERE fields_name='email'
    

    使用IN,您可以对数据库进行 1 次调用:

    SELECT fields_name, fields_type FROM `tbl_form_builder_fields` WHERE fields_name IN ('firstname','lastname','mobileno','age','gender','building','sector','city','counsellername','mobile','email')
    

    【讨论】:

      【解决方案3】:

      explode 函数需要第二个参数作为字符串而不是数组。您必须进一步深入您的数组以获取字符串

      $get_elements = array(
          'student_elements' => $row->student_elements, 
          'address_elements' => $row->address_elements,  
          'marketing_elements' => $row->marketing_elements, 
          'office_use_elements' => $row->office_use_elements, 
      );
      for($get_elements as $key=>$value){
          $value = explode(',', $value);
        //run your query here
      }
      

      【讨论】:

      • 我得到一个错误,语法错误,意外'as'(T_AS),期待';'
      • 它的语法错误,你写的是for循环而不是foreach
      猜你喜欢
      • 2021-11-21
      • 1970-01-01
      • 1970-01-01
      • 2016-08-11
      • 2022-01-18
      • 1970-01-01
      • 2020-08-28
      • 2017-09-23
      相关资源
      最近更新 更多