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"
}
}
*/