У меня проблема со скриптом обработки. Я хотел бы разрешить максимум 2 дублирующихся IP-адреса в CSV-файле, чтобы предотвратить спам и учесть, что пользователь может ошибиться при заполнении формы. Кажется, я не могу правильно сослаться на переменную $ ip в скрипте, или, может быть, я чего-то упускаю. Ниже приведен фрагмент кода:
<?php
#VARIABLE DECLARATIONS (filename and post vars) GO HERE
$counter = 0;
if (file_exists($filename))
{
$file = fopen($filename, "a");
while($data = fgetcsv($filename)){
if(isset($data[$ip])){
$counter++;
continue;
if((isset($data[$ip])){
$counter++;
if($counter == 2){
echo "";
}
}
}
}
##file write goes here
}
?>
Любая помощь в этом будет оценена,
Джим
Сначала вам нужно будет прочитать все элементы в массиве, и только после того, как у вас будет готово число вхождений каждого IP-адреса, следует продолжить запись файла (может быть отдельный файл?).
Сначала вы можете подготовить массив с индексами IP и всеми строками, соответствующими IP, в качестве атрибутов значения этого ключа.
Это может быть сделано —
$csvArray = str_getcsv(file_get_contents('myCSVFile.csv'));
foreach($csvArray as $eachRow)
{
//prepare IP indexed array with every detail row as an attribute of the corresponding IP key.
$properlyFormattedArray[$eachRow[5]][] = $eachRow;
}
Вы получаете массив, как это —
Array(['92.27.21.171'] =>
[0] => Array("Mr","Test","davis","07972889989","01159174767","92.27.21.171"),
[1] => Array("Mr","bob","jones","07998998008","01159174767","92.27.21.171"),...
['92.27.21.172'] => ...
)
Если у вас есть этот массив, просто зациклите его и пишите только по максимуму 2 строки для каждого IP.
foreach($properlyFormattedArray as $ip => $details)
{
$count = 0;
foreach($details as $eachDetail)
{
if($count<2)
{
//write $eachDetail into file
$count++;
}
}
}
Но в этом случае порядок данных (по сравнению с вашим входным файлом) будет изменен, и дубликаты будут записаны в последовательные строки в файле CSV (не уверен, что с вами все будет в порядке).
Других решений пока нет …