Обработка fgetcsv

Jovanni

Новичок
Работает некорректно:
Файл text.csv

PHP:
166,192.168.1.1,29.22.22.33
22222,6.237.223.3,33.33.33.33
44444,6.27.13.2,192.168.1.1
44444,28.22.123.1,192.168.1.11
166,6.22.23.3,29.22.22.32
22222,6.22.123.3,33.33.33.32
44444,6.27.123.22,192.168.1.111
44444,6.22.123.2,192.168.1.11
44444,6.27.123.22,192.168.1.1
44444,6.27.123.22,192.168.1.11
calc.php

PHP:
$fh = fopen ( 'text.csv', 'r' );
for($i=0; $info = fgetcsv ($fh, 1000, ","); $i++)
{
list($octets,$source,$dest) = $info;
if (in_array($dest="192.168.1.1",$info)) { 
$params="$octets,$source,$dest";
echo "$params<br>";
}else {
echo "does not<br>";
}
Выводит

PHP:
166,192.168.1.1,29.22.22.33
does not
44444,6.27.13.2,192.168.1.1
does not
does not
does not
does not
does not
44444,6.27.123.22,192.168.1.1
does not
А мне нужно что бы он искал только в $dest
то есть если правильно написать то он должен только 2 ую и 9 ую строку выводить.
Что делаю не так ???
Помогите!!!
Спасибо заранее!!!!
 

flr

Новичок
Твоя проблема в конструкции
PHP:
if (in_array($dest="192.168.1.1",$info)) {
Здесь ты во-первых проверяешь вхождение 192.168.1.1 во всем массиве $info, а во-вторых ещё и меняешь $dest на 192.168.1.1
Замени эту строку на
PHP:
if ($dest == "192.168.1.1") {
 

Jovanni

Новичок
flr
А как заменить $source на что либо в найденных строках ??
 

flr

Новичок
Jovanni
после строчки
PHP:
list($octets,$source,$dest) = $info;
у тебя есть три переменные $octets,$source,$dest, которые соответственно и хранят полученные значения.
Если хочешь заменить $source на, например, 127.0.0.1, следовательно пишешь $source = '127.0.0.1'; и дальше там используешь это как тебе нужно.
Возможно я неверно понял вопрос.
 

Jovanni

Новичок
нет не совсем то...
есть другой файл.
ip2name.txt
И он выглядет так:

PHP:
129.0.0.1 odnoklassniki.ru
192.168.0.22  mail.ru
Сравнить $source с каждой строкой реально ??
И заменить если $source = 129.0.0.1
то на odnoklassniki.ru
 

flr

Новичок
Jovanni
как вариант так:

1. читаем файл
2. формируем массив $ip2namesArray вида ip => домен (код сработает только если ip и домены в файле разделены пробелами, иначе вставь свой разделитель, например табуляцию или что там)
3. когда читаем строки из csv проверяем есть ли у нас ip в нашем массиве, если есть, то заменяем его на домен

PHP:
$ip2names = file_get_contents('ip2name.txt');
$ip2namesLines = explode("\n", $ip2names);
$ip2namesArray = array();
foreach($ip2namesLines as $line) {
  list($lineIp, $lineDomain) = explode(" ", $line);
  $ip2namesArray[$lineIp] = $lineDomain;
}
$fh = fopen ( 'text.csv', 'r' );
for($i=0; $info = fgetcsv ($fh, 1000, ","); $i++) {
  list($octets,$source,$dest) = $info;
  if ($dest =="192.168.1.1") {
    if ($ip2namesArray[$source]) {
      $source = $ip2namesArray[$source];
    }
    $params="$octets,$source,$dest";
    echo "$params<br>";
  }else {
    echo "does not<br>";
  }
}
 

cDLEON

Онанист РНРСlub
flr
мне здесь нужно проектик один вроде вконтакте написать. Я не знаю как. Не поможешь ?
 

Jovanni

Новичок
А можно еще 1 вопросик.
Почему то fputs получается сделать....

PHP:
$ip2names = file_get_contents('ip2name.txt');
$ip2namesLines = explode("\n", $ip2names);
$ip2namesArray = array();
foreach($ip2namesLines as $line) {
list($lineIp, $lineDomain) = explode(" ", $line);
$ip2namesArray[$lineIp] = $lineDomain;
}

$fh = fopen ( 'text', 'r' );
$fp = fopen ( 'www', 'w' );
for($i=0; $info = fgetcsv ($fh, 1000, ","); $i++)
{
list($octets,$source,$dest) = $info;
if ($dest == $ip) { 
    if ($ip2namesArray[$source]) {
      $source = $ip2namesArray[$source];
    }
    $params="$octets,$source,$dest";
    echo "$params<br>";
fputcsv($fp,$info);
}else {
echo "does not<br>";
}

}
Кладет найденные адреса
без изменении..

PHP:
44444,23.233.22.2,192.168.1.11
44444,129.0.0.1,192.168.1.11
44444,22.22.22.22,192.168.1.11
 

flr

Новичок
Потому что делаешь fputs не измененных данных ($octets,$source,$dest), а своих старых исходных ($info);
Соответственно строку
PHP:
fputcsv($fp,$info);
надо заменить на строку
PHP:
fputcsv($fp,array($octets,$source,$dest));
 
Сверху