2013-05-10 4 views
2

Как я могу взять массив с отдельными строками, но также разделенные запятыми строки и взорвать элементы, разделенные запятыми, на отдельные элементы? Например:PHP array - взорвать отдельные элементы, разделенные запятыми, на новые элементы

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). –

+0

Почему вы не используете функцию разрыва в php? – SAVAFA

+0

@SaVaFa Да, я знаю, что мне нужно использовать 'explode'.Но я не уверен, как его реализовать, потому что не «взорвать» возвращает другой массив? Будет ли я просто перебирать массив с разнесением и «нажимать» на исходный массив? Я предполагаю, что есть более элегантное решение? – frankie

ответ

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

Вы можете пользователь explode() функция в PHP и слияния возвращения массива в $product_array. somthing вот так:

$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

+0

@Aquillo, Какая у вас проблема с preg_split()? Он возвращает тот же ответ, что требует OP, и это довольно быстро, чем ваш массив_мергей, и взорваться, когда вы делаете две операции. –

+0

Вы добавляете «10003» «10016» (станет «1000310016») с eachother, то есть нет разделителя для разделения? Этот код не будет работать. – Aquillo

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 Note] (http://php.net/manual/en/function.strstr.php), в котором указано, что использование strstr() для проверки существования подстроки неэффективно. Как показывают другие ответы, никаких условных условий не требуется; это означает вторую потерю эффективности из-за ненужных итерируемых вызовов функций. – mickmackusa

-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); 
Смежные вопросы