2016-02-10 4 views
1

Я просто печать значения из данных, полученных из MySQLОбъединить массивы на основе повторяющихся значений PHP

$sql = "SELECT * FROM tablename"; 
$res = mysql_query($sql); 
$rs = getAll($res); 

for($k = 0; $k < count($rs); $k++) 
{ 
    $email = $rs[$k]['emailid']; 
    $name = $rs[$k]['name']; 
    $content = "<table><tr><td>Name</td><td>Email</td></tr><tr>  <td>'.$name.'</td><td>'.$email.'</td></tr></table>"; 
} 

Теперь $content выглядит следующим образом.

-------------- 
Name Email 
-------------- 
n1  email1 


-------------- 
Name Email 
-------------- 
n2  email2 


-------------- 
Name Email 
-------------- 
n3  email1 

Теперь я хочу, чтобы объединить строки HTML таблицы, основанные на общих электронного идентификатора. Так что это должно выглядеть

-------------- 
Name Email 
-------------- 
n1  email1 
n3  email1 


-------------- 
Name Email 
-------------- 
n2  email2 

имя n1 и n3 объединяются на основе «EMAIL1». Как мне это достичь?

ответ

2

вариант 1) Вы можете заказать по электронной почте, а затем результаты цикла с PHP заполняя некоторый массив, проверьте, если изменения электронной почты от преда, и так далее, как Rajdeb объясняет другой ответ:

SELECT * FROM tablename ORDER BY EMAIL; 

вы получите:

n1  email1 
n2  email2 
n3  email1 

вариант 2) Вы можете использовать GROUP_CONCAT для получения имен, приклеенных по электронной почте. Затем в php-цикле для каждого отдельного письма вы получаете имена, разделенные запятыми. Единственная задача, которую нужно выполнить здесь, - это массив взорвать, чтобы получить имена в массиве и поместить в ячейку таблицы, цикл только один раз для каждого письма, с меньшей работой php. Заказ по электронной почте является необязательным.

SELECT GROUP_CONCAT(NAME) AS NAME, EMAIL 
FROM tablename GROUP BY EMAIL ORDER BY EMAIL; 

вы получите:

n1,n3  email1 
n2  email2 

Если вы хотите изменить символ запятой для разделения имен, с "-", например, вам нужно добавить СЕПАРАТОРА к предыдущему запросу:

SELECT GROUP_CONCAT(NAME SEPARATOR '-') AS NAME, EMAIL 
FROM tablename GROUP BY EMAIL ORDER BY EMAIL; 

вы получаете:

n1-n3  email1 
n2  email2 

Надеюсь, это поможет вам! :)

1

Прежде всего, добавьте ORDER BY пункт к вашему SELECT запроса, как это:

$sql = "SELECT * FROM tablename ORDER BY emailid"; 

И после получения набора результатов, используя $rs = getAll($res); процесс так:

// your code 

$rs = getAll($res); 

$prevEmail = ''; 
$content = '<table>'; 
for($k=0; $k < count($rs); $k++){ 
    $email = $rs[$k]['emailid']; 
    $name = $rs[$k]['name']; 
    if(empty($prevEmail)){ 
     $content .= '<tr><td>Name</td><td>Email</td></tr><tr><td>'.$name.'</td><td>'.$email.'</td></tr>'; 
     $prevEmail = $email; 
    }else{ 
     if($prevEmail == $email){ 
      $content .= '<tr><td>'.$name.'</td><td>'.$email.'</td></tr>'; 
     }else{ 
      $content .= '</table><table><tr><td>Name</td><td>Email</td></tr><tr><td>'.$name.'</td><td>'.$email.'</td></tr>'; 
      $prevEmail = $email; 
     } 
    } 
} 
$content .= '</table>'; 
echo $content; 

Sidenote: Не используйте функции mysql_*, они устарели от PHP 5.5 и полностью удаляются в PHP 7.0. Вместо этого используйте mysqli или pdo. And this is why you shouldn't use mysql_* functions.

Смежные вопросы