【问题标题】:PHP array - explode some comma separated elements into new itemsPHP数组 - 将一些逗号分隔的元素分解为新项目
【发布时间】:2013-05-10 06:03:17
【问题描述】:

如何获取包含单个字符串以及逗号分隔字符串的数组并将逗号分隔的项目分解为单个项目?例如:

while(($row =  mysql_fetch_array($downloads_query))) {
        $product_array[] = $row['product']; 
    }

$product_array[] 返回:

item 1: "10003"
item 2: "10016"
item 3: "10008, 10007, 10010"

如何将项目 3 拆分为单独的项目 3、4 和 5,以便 $product_array 返回:

item 1: "10003"
item 2: "10016"
item 3: "10008"
item 4: "10007"
item 5: "10010"

【问题讨论】:

标签: php arrays parsing


【解决方案1】:

explode() - PHP.net

根据给定的分隔符分解一个字符串,结果是一个数组。值得一提的是:如果您的字符串中没有单个分隔符,它仍然会转换为像Array ( [0] => abc ) 这样的数组。这意味着您甚至不需要将项目 1 和 2 转换为数组即可让 array_merge() 正常工作。

array_merge() - PHP.net:

将多个数组合并成一个数组。

$items = new array();
while(($row =  mysql_fetch_array($downloads_query))) {
    $items = array_merge($items, explode(',', $item3));
}

【讨论】:

    【解决方案2】:
    while(($row =  mysql_fetch_array($downloads_query))) {
            if(strpos($row['product'],',') > -1){
                    $product_array += explode(',',$row['product']);
            } else {
                    $product_array[] = $row['product']; 
            }
        }
    

    这是快速解决方案 :) 如果有逗号,它会在将其添加到您的数组之前将其爆炸。

    • 其他人注意到 myslq_ 函数已被弃用 .. 最好使用 mysqli 或 PDO 代替 :)

    【讨论】:

      【解决方案3】:

      你可以这样试试:

      while(($row = mysql_fetch_array($downloads_query))) {
        if(strstr($row['product'], ',')) {
          $product_array = array_merge(explode(',',$row['product']), $product_array);
        } else {
         $product_array[] = $row['product'];
        } 
      }
      

      【讨论】:

      • 这是一个没有采用最佳实践的纯代码答案。请参阅the php manual Note,指出使用 strstr() 检查子字符串的存在是无效的。如其他答案所示,根本不需要条件;这意味着由于不必要的迭代函数调用而导致第二次效率损失。
      【解决方案4】:

      您可以在php中使用explode()函数并将返回数组合并到$product_array中。像这样的东西:

      $product_array = array_merge(explode(',', $commaSeperatedArray), $product_array); 
      

      【讨论】:

        【解决方案5】:

        专业建议是不要做你正在做的事情。您不应该在表格列中存储逗号分隔的值。这些应该在自己的表中,并在需要时加入。

        无论如何,您可以使用展开运算符 (...) 无条件地将生成的数组分解并推送到永久平坦的结果数组中。

        代码:(Demo)

        $array = [
            "10003",
            "10016",
            "10008, 10007, 10010",
        ];
        
        $result = [];
        foreach ($downloads_query as $row) {
            array_push($result, ...explode(', ', $row['product']));
        }
        var_export($result);
        

        输出:

        array (
          0 => '10003',
          1 => '10016',
          2 => '10008',
          3 => '10007',
          4 => '10010',
        )
        

        【讨论】:

          【解决方案6】:

          未经测试,但可以。

          function process_array($row)
          {
              $result=array();
              $product=$row['product'];
          
              if(strpos($product, ',')!==false)
              {
                  $result[]=explode(',', $product);
              }
              else
              {
                  $result[]=$product;
              }
          
              return $result;
          }
          
          /////
          
          $product_array=array();
          
          while(($row =  mysql_fetch_array($downloads_query))) 
          {
              $product_array=array_merge($product_array, proccess_array($row))
          }
          

          你懂的……

          【讨论】:

            【解决方案7】:

            使用preg_split() 而不是explode()。 您可以在函数中添加任意数量的分隔符。

            <?php
            while(($row =  mysql_fetch_array($downloads_query))) {
                    $string .= $row['product']." "; 
                }
                $product_array = preg_split( "/[;, ]/", $string);
            ?>
            

            【讨论】:

            • 你为什么要使用preg_split()?没有提到 OP 需要在多个分隔符上拆分的单一要求。
            • @Aquillo,你对 preg_split() 有什么问题?它确实返回了 OP 需要的相同答案,这比您的 array_merge 快得多,并且在您执行两个操作时会爆炸。
            • 您将“10003”“10016”(将变为“1000310016”)彼此附加,这意味着没有分隔符可以分割?此代码不起作用。
            • 您可能需要在$row['product'] 之前添加空格,因为这仍会导致我之前提到的问题。除此之外,很好的解决方案。
            【解决方案8】:
            $format_Arr = array("test1","test2,test2.1","test3","test4,test5,test6,test7");
            $formated_arr = array();
            foreach($format_Arr as $arr){
            $arr1 = explode(",",$arr);
            if(count($arr1)>1){
                $formated_arr = array_merge($formated_arr,explode(',',$arr));
            }else{
                $formated_arr[]= $arr;
            }
            }
            print_r($formated_arr);
            

            【讨论】:

              猜你喜欢
              • 2012-04-08
              • 2023-03-29
              • 2017-10-30
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2019-04-28
              • 1970-01-01
              相关资源
              最近更新 更多