I have a database with different kind of products that have similar ID’s (EAN codes). I’m trying to print a list of all similar codes so I can import them and connect them to the same product.
Example:
Product Y has ID 190198001795 and 0190198001795
Product X has ID 190198001780, 0190198001780 and 00190198001780
What I’m trying to achieve:
190198001795 – 0190198001795 190198001795 – 0190198001780 – 00190198001780What did I try: Create a foreach to ‘group’ the similar ID’s, but eventually this may corrupt the correct groups.
<? // GET ALL PRODUCT ID's $sql = "SELECT * FROM `products`"; $result = $mysqli->query($sql); if ($result->num_rows > 0) { // output data of each row while($row = $result->fetch_assoc()) { // Total Downloads - Thousand sperator $shopID = $row["id"]; $EAN = $row["ean"]; $sqlDouble = "SELECT * FROM `products` WHERE `EAN` IN ('$EAN','0$EAN','00$EAN','000$EAN') LIMIT 200"; $resultDouble = $mysqli->query($sqlDouble); if ($resultDouble->num_rows > 1) { // output data of each row while($row = $resultDouble->fetch_assoc()) { $EAN = $row["ean"]; $shopID = $row["id"]; $children[] = $EAN; } } } } foreach (array_chunk($children, 2, true) as $array) { echo '<div>'; foreach($array as $kicks) { echo $kicks." "; } echo '</div>'; } ?>
Is there another way to parse trough my rows and check / combine similar ID’s?
Advertisement
Answer
Try this. See comments for explanation. Outputs:
array(2) { [190198001780]=> array(2) { [2]=> string(13) "0190198001780" [8]=> string(14) "00190198001780" } [1234]=> array(2) { [5]=> string(5) "01234" [6]=> string(6) "001234" } }
Code:
<?php $eans = ['190198001780', '8715839583923', '0190198001780', '015839583923', '1234', '01234', '001234', '001235', '00190198001780']; foreach ($eans as $ean) { // For all EANs that do not have a leading zero, try to find // similar ones by looking for the same code with one or more leading // zeroes. if ($ean[0] !== '0' && ctype_digit($ean)) { // Look for any occurrences of this EAN with one or more (+) leading zeroes. // If no similar EANs found, then don't record any. if ($matches = preg_grep('/[0]+' . $ean . '/', $eans)) $children[$ean] = $matches; } } var_dump($children); /* array(2) { [190198001780]=> array(2) { [2]=> string(13) "0190198001780" [8]=> string(14) "00190198001780" } [1234]=> array(2) { [5]=> string(5) "01234" [6]=> string(6) "001234" } } */