Цикл PHP foreach и отдельные строки с полем, имеющим одинаковое значение

#foreach

#foreach

Вопрос:

У меня есть таблица базы данных, в строке которой есть поле, которое может иметь то же значение. Это поле «идентификатор транзакции», в котором будет номер заказа. Строки могут иметь один и тот же номер заказа, но разные идентификаторы продукта для каждого заказанного товара.

Я отлично запрашиваю базу данных и также выводю данные. Однако я хочу разделить одинаковые идентификаторы транзакций и сделать что-то другое с этими данными. Я просто могу понять, как это сделать по какой-то причине.

пример:

 ID        txn_id        product_id       Product_name      field5
--------  ---------     -----------      ---------         ---------
1         265           98               Product Name
2         265           99               Product Name
3         244           98               Product Name
  

Обновить

Итак, вот мой обновленный код, который все еще нуждается в помощи. Сейчас у меня два запроса. Один, который проверяет наличие дубликатов и помещает их в массив, затем другой, который перебирает таблицу базы данных с помощью оператора if, который проверяет совпадающие идентификационные номера транзакций.

Первый запрос:

 $myquery = $wpdb->get_results("SELECT txn_id , COUNT(*) FROM test_table HAVING COUNT(*) > 1");
global $TXN;                    
foreach($myquery as $query){
    $TXN= $query->txn_id;   
}
  

Затем в основном запросе / цикле

 global $wpdb;
$prepare_query = $wpdb->get_results("SELECT * FROM test_table" );

foreach($prepare_query as $data){
    $txn_id = $data->txn_id;
    $product_id = $data->product_id;
    $product_name = $data->product_name;
    ?>
    <table class="shop_table my_account_orders" width="100%">
        <thead>
            <tr>
                <th align="left">Order #</th>
                <th align="left">Product ID</th>
                <th align="left">Product Name</th>
            </tr>
         </thead>

         <tbody>
             <tr class="order">
                 <td>
                     <?php echo "#" .$txn_id; ?>
                     <?php
                        if($txn_id === $TXN){
                            echo'YES';
                        }
                      ?>
                 </td>
                 <td>
                     <?php echo $product_id; ?>
                 </td>
                 <td>
                     <?php echo $product_name; ?>
                 </td>  
             </tr>
         </tbody>
    </table>
<?php } ?>
  

Это выведет:

 <table width="100%">
	<thead>
		<tr>
		<th align="left">Order #</th>
		<th align="left">Product ID</th>
		<th align="left">Product Name</th>
		</tr>
	</thead>
	<tbody>
		<tr>
			<td>#265 YES</td>
			<td>98</td>
			<td>Product Name</td>
		</tr>
	</tbody>
</table>

<table width="100%">
	<thead>
		<tr>
		<th align="left">Order #</th>
		<th align="left">Product ID</th>
		<th align="left">Product Name</th>
		</tr>
	</thead>
	<tbody>
		<tr>
			<td>#265 YES</td>
			<td>99</td>
			<td>Product Name</td>
		</tr>
	</tbody>
</table>

<table width="100%">
	<thead>
		<tr>
		<th align="left">Order #</th>
		<th align="left">Product ID</th>
		<th align="left">Product Name</th>
		</tr>
	</thead>
	<tbody>
		<tr>
			<td>#244</td>
			<td>98</td>
			<td>Product Name</td>
		</tr>
	</tbody>
</table>  

Когда я хочу получить:

 <table width="100%">
	<thead>
		<tr>
		<th align="left">Order #</th>
		<th align="left">Product ID</th>
		<th align="left">Product Name</th>
		</tr>
	</thead>
	<tbody>
		<tr>
			<td>#265 YES</td>
			<td>98</td>
			<td>Product Name</td>
		</tr>
		<tr>
			<td>#265 YES</td>
			<td>99</td>
			<td>Product Name</td>
		</tr>
	</tbody>
</table>

<table width="100%">
	<thead>
		<tr>
		<th align="left">Order #</th>
		<th align="left">Product ID</th>
		<th align="left">Product Name</th>
		</tr>
	</thead>
	<tbody>
		<tr>
			<td>#244</td>
			<td>98</td>
			<td>Product Name</td>
		</tr>
	</tbody>
</table>  

Ответ №1:

Чтобы получить дублированные идентификаторы, вы могли бы использовать:

 SELECT id,txn_id , COUNT(*)
FROM table_name
HAVING COUNT(*) > 1
  

Замените, конечно, имя_таблицы на имя вашей таблицы

Комментарии:

1. Итак, чтобы заставить это работать, я создал еще один запрос вне цикла заказов клиентов и превратил его в массив переменных, затем внутри цикла заказов я создал оператор and if, чтобы проверить, соответствует ли какой-либо из идентификаторов транзакции дубликатам в массиве. Чтобы проверить это, я вывожу «TRUE» рядом с каждым порядком, который является дубликатом, и это работает. Тем не менее, мне все равно нужно затем разделить эти данные и объединить идентификаторы продукта.

2. По сути, в этом основном цикле я хочу разделить два элемента, которые имеют одинаковый идентификатор транзакции, на отдельный вывод <tabel></table>, чем идентификаторы транзакций, которые не совпадают.

Ответ №2:

В итоге я сделал это так:

 $myArray = $wpdb->get_results("SELECT * FROM " . $license_table);
    $newArray=array();                  
    foreach($myArray as $val){
        $newKey=$val->txn_id;
        $newArray[$newKey][]=$val;
    }
    print_r($newArray);

    foreach ($newArray as $key => $array){
        ?>
        <table border="0" cellpadding="0" cellspacing="0">
            <tr class="header">
                <td width="73%" valign="top">KEY</td>
                <td width="73%" valign="top">Product Id</td>
                <td width="27%" valign="top">Product Name</td>
            </tr>
                <?php
                foreach($array as $values) {
                    ?> 
            <tr class="details">
                <td width="27%" valign="top"><?php echo $key; ?></td>
                <td width="73%" valign="top"><?php echo $values->product_id; ?></td>
                <td width="27%" valign="top"><?php echo $values->product_name ?></td>
            </tr>
               <?php } ?>
        </table>
        <?php
    }