Эта тема на forum.dklab.ru


Neo: Сравнение массивов
Задача: Необходимо сравнить данные, находящиеся в БД и данные из .csv файла.
Если хотя бы одно поле не совпадает то добавляем, иначе -нет.
Создал 2 2-мерных массива. в одном - инфа из файла, в другом - из БД.
Структура массива из файла:

Array ([0] => Array (
[0] => 26K5655
[1] => SAS
[2] => DiskStar
[3] => "HDD IBM 73GB HS 2.5"" SAS SFF 10K x366x460"
[4] => 50
[5] => 62857
[6] => 1 год
[7] => HDD
[8] => IBM
[9] => 0
[10] => 10
[11] => 1 )
[1] => Array ( ...)
...[/CODE:1:43aa7f1696]
Структура массива из БД:

Array ( [0] => Array (
[0] => kbx-7857 => kbx-7857
[1] => Z61 => Z61
[2] => Z-series => Z-series
... )
[1] => Array ( [0] => SZV465 => SZV465 [1] => VGN-SZ4MRN => VGN-SZ4MRN [2] => VGN-seires => VGN-seires ... ) ...
[/CODE:1:43aa7f1696]
Как сравнить никак не придумаю что-то. пробовал in_array. не срабатывает. Может по-другом выбрать массивы?
БД:

$res = $con->action($query) or die(mysql_error());
while ($line[] = mysql_fetch_array($res)) {
}
[/PHP:1:43aa7f1696]
.csv :

$handle = fopen("price.csv", "r");
while (($data = fgetcsv($handle, 10000, ",")) !== FALSE) {
$num = count($data);
$row++;
for ($c=0; $c < $num; $c++) {
GLOBAL $check;
$check[] = explode(";", $data[$c]);
}
}
fclose($handle);
[/PHP:1:43aa7f1696]
Антон Макаренко:
Можно вычислить схождение массивов как по значениям:
http://www.php.net/manual/ru/function.array-intersect.php
так и по ключам:
http://www.php.net/manual/ru/function.array-intersect-key.php
WingedFox:
Neo
Если бы Вы привели пару одинаковых данных, было бы проще давать советы.
Можно
a) дать цифровые алиасы выбираемым полям
б) сравнивать с array_values для каждой строчки из базы
Neo:
Все - вроде придумал.

$nmz=array();
for($i=0;$i<count($check);$i++){

for($j=0;$j<count($line)-1;$j++){

$nums = array_diff($check[$i],$line[$j]);

if (count($nums) == 0){
echo ("Полное совпадение!");
echo("i: ".$i." j: ".$j."<br>");
$nmz[]=$i;
}
else{
//echo($check[$i][$j]." : ".$line[$j][$i]."<br>");
}
}
}


$cnt=0;
for($i=0;$i<count($check);$i++){

if($i == $nmz[$cnt]){
$cnt++;
}
else {

for($j=0;$j<12;$j++){

echo "".$check[$i][$j]."<br>";
}
}
}
Если кому понадобится.
Neo:
Собстно снова вылезла проблема.Никак не пойму в чем дело - если очистить таблицу и загнать с помощью скрипта данные в БД то при повтроной загрузке из того же файла выдается все норм - что все совпадает. Но стоит добавить в файл строчку и все - почему- как-то хаотично начинает срабатывать.

<?php
$query = "SELECT partnum,model,series,name,costs,price,warranty,category,brand,discontinued,crit_level,active from catalog";
GLOBAL $line;
$res = $con->action($query) or die(mysql_error());
while ($line[] = mysql_fetch_row($res)) {}

$filename = "price.csv";
$row = 1;
$handle = fopen($filename, "rb");
while (($data = fgetcsv($handle, 10000, ",")) !== FALSE) {
$num = count($data);
// echo "<p> $num полей в строке $row: <br /></p>\n";
$row++;
for ($c=0; $c < $num; $c++) {
// echo $data[$c] . "<br />\n";
GLOBAL $check;
$check[] = explode(";", $data[$c]);

}

}
fclose($handle);

$nmz=array();
for($i=0;$i<count($check);$i++){

for($j=0;$j<count($line)-1;$j++){

$nums = array_diff($check[$i],$line[$j]);

if (count($nums) == 0){
echo ("Полное совпадение!");

echo("i: ".$i." j: ".$j."<br>");


$nmz[]=$i;
$err = count($nmz);

}
else{
//echo($check[$i][$j]." : ".$line[$j][$i]."<br>");
}
}
}
echo("<h3>".$err."</h3>");

if ($err == $row-1) exit("Все поля совпадающие!");


$cnt=0;
for($i=0;$i<count($check);$i++){

if($i == $nmz[$cnt]){
$cnt++;

}
else {

$partnum = $check[$i][0];
$model = $check[$i][1];
$series= $check[$i][2];
$name = $check[$i][3];
$costs = $check[$i][4];
$price = $check[$i][5];
$warranty = $check[$i][6];
$category = $check[$i][7];
$brand = $check[$i][8];
$discontinued = $check[$i][9];
$crit_level = $check[$i][10];
$active = $check[$i][11];

$que= "INSERT INTO catalog
(partnum,model,series,name,costs,price,warranty,category,brand,discontinued,crit_level,active)
VALUES
('$partnum','$model','$series','$name','$costs','$price','$warranty','$category','$brand','$discontinued','$crit_level','$active')";

//echo $que;

if($con->action($que)){
echo("All OK!");
echo("<a href=\"index.php\">Назад</a>");
}
else{
echo("Ошибка при внесении данных. Попробуйте позднее");
echo mysql_error();
}
}
}
?>

Эта тема на forum.dklab.ru