2013-05-10 86 views
2

如何获取单个字符串的数组,然后以逗号分隔的字符串并将逗号分隔的项目分解为单个项目?例如:PHP数组 - 将一些用逗号分隔的元素分解为新项目

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" 
+4

[**请不要在新的代码中使用'mysql_ *'功能**](http://bit.ly/phpmsql)。他们不再被维护[并被正式弃用](https://wiki.php.net/rfc/mysql_deprecation)。看到[**红框**](http://j.mp/Te9zIL)?学习[*准备的语句*](http://j.mp/T9hLWi),并使用[PDO](http://php.net/pdo)或[MySQLi](http://php.net/ mysqli) - [这篇文章](http://j.mp/QEx8IB)将帮助你决定哪个。如果您选择PDO,[这里是一个很好的教程](http://stackoverflow.com/questions/12859942/why-shouldnt-i-use-mysql-functions-in-php/14110189#14110189)。 – 2013-05-10 06:04:27

+0

为什么你不使用PHP中的爆炸函数? – SAVAFA 2013-05-10 06:06:30

+0

@SaVaFa是的,我知道我必须使用'explode'。但我不知道如何实现它,因为'爆炸'返回另一个数组?我会简单地迭代爆炸数组并将'push'到原始数组吗?我认为有一个更优雅的解决方案? – frankie 2013-05-10 06:07:47

回答

1
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来代替:)
0

可以用PHP和合并返回数组$product_array用户explode()功能。像这样:

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

未经测试,但在这里。

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

你的想法...

5

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

利用preg_split()代替explode()。 您可以在函数中添加任意数量的分隔符。

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

你为什么要用'preg_split()'?没有提到OP需要分割多个分隔符的单个需求。 – Aquillo 2013-05-10 06:15:42

+0

@Aquillo,你有什么问题与preg_split()?它确实返回了OP所需的相同答案,这比你的array_merge快得多,并且在你做两个操作时会爆炸。 – 2013-05-10 06:33:24

+0

您正在追加“10003”“10016”(会变成“1000310016”),这意味着没有可以分割的分隔符?此代码不起作用。 – Aquillo 2013-05-10 06:40:14

1

你可以尝试这样的:

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']; 
    } 
} 
+0

这是一个仅使用代码的答案,不采用最佳做法。查看[php手册注意](http://php.net/manual/en/function.strstr.php),指出使用strstr()检查子字符串的存在效率不高。如其他答案所示,根本不需要条件;这意味着由于不必要的迭代函数调用而导致第二次效率损失。 – mickmackusa 2017-10-15 02:25:17

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