PDA

View Full Version : سوال: کدی نوشتم که شماره موبایلهای جدید رو ثبت میکنه ولی اشتباه میکنه. لطفا راهنمایی کنید



nekooee
سه شنبه 07 خرداد 1392, 20:01 عصر
سلام
یک کد نوشتم که از یک فایل txt در هر سطر که شماره موبایل باشه اون سطر رو با فایل مقصد جک میکنه و اگر تکراری نباشه ثبتش میکنه.
اما درست کار نمیکنه. نمیدونم چرا. میشه راهنمایی کنید؟




<?php
//تنظیمات
$filename_S="info.txt";//نام فایل مبدأ را وارد کنید
$filename_D="output.txt";//نام فایل مقصد را وارد کنید


//code...
$file_S=fopen("$filename_S", "r")or die("Error: Can't open the file.");
$file_D=fopen("$filename_D", "a+")or die("Error: Can't open the file.");

function search($num)
{
global $filename_D;
global $file_D;
$result=false;
while(!feof($file_D))
{
$line=fgets($file_D);
if($line==$num)
{
$result=true;
return $result;
break;
}
}
}

$tedad=0;
while(!feof($file_S))
{
$line=fgets($file_S);
if (preg_match("/^09([0-9]{9,13})/", $line))
{
if (search($line)==false) {
fwrite($file_D,"$line");
++$tedad;
}


}
}
echo '<center dir="rtl">'.$tedad.'عدد جدید ثبت گردید</center>';
fclose($file_S);
fclose($file_D);
?>

nekooee
سه شنبه 07 خرداد 1392, 20:25 عصر
وقتی تست میکنم به اولین عدد غیر تکراری برسه از اونجا به بعد همش رو ذخیره میکنه و اعداد بعدی رو تست نمیکنه که تکراری هستند یا نه! انگار که اولین باری مقدار false برگشت داده شد دیگه مقدار تابع تغییر نمیکنه در حالی باید تغییر می کرد!
چرا اینجوری؟

$ M 3 H R D A D $
سه شنبه 07 خرداد 1392, 20:42 عصر
از هر دو فایل بخون اطلاعاتو به تابع file ه میریزه هر خط و تو ارایه
حالا 2 تا ارایه داری
با تابع array_merg اونارو ادغام کن
و بعدش با تابع array_uniq تکراری ها و حذف کن
کلا 4 ا کد کده

nekooee
سه شنبه 07 خرداد 1392, 20:53 عصر
خیلی ممنون از پاسختون. البته به روشی که شما گفتید حتما بهتر هست اما باید دوباره کدها رو بنویسم و هنوز مبتدی هستم و سختمه.
الآن می خوام بدونم کد بالا چرا جوابش درست نمیشه؟ چون من خط به خط بارها تجزیه و تحلیل کردم باید درست باشه ولی جواب نمیده! چرا؟

nekooee
چهارشنبه 08 خرداد 1392, 02:53 صبح
من کد رو کلا عوض کردم و با کمک دوستم از طریق آرایه نوشتم. الان بازم یک مشکل داره که شماره آخر اگر تکرار شده باشه دوبار میزنه. حتی چند بارم تکرار شده باشه همون دوباره رو میزنه. و هر بار که رفرش کنم هم شماره آخر هر چی که باشه یک بار دیگه به انتخای سط اضافه میشه!! چرا شماره آخر دوبار میخوره و بعد هم با هر رفرش یک بار دیگه اضافه میشه؟
لطفا راهنمایی کنید



//تنظیمات
$filename_S="info.txt";//نام فایل مبدأ را وارد کنید
$filename_D="output.txt";//نام فایل مقصد را وارد کنید

//code...
$exists_numbers_S = array();
$file_S=fopen("$filename_S", "r")or die("Error: Can't open the file.");
$file_D=fopen("$filename_D", "a+")or die("Error: Can't open the file.");

while(!feof($file_D))
{
$exists_numbers_D[]=fgets($file_D);
}
$tedad=0;
while(!feof($file_S))
{
$line=fgets($file_S);
if (preg_match("/^09([0-9]{9,13})/", $line))
{
if ( !in_array($line, $exists_numbers_S) && !in_array($line, $exists_numbers_D)) {
fwrite($file_D,"$line");
$tedad++;
$exists_numbers_S[] = $line;
}
}
}
echo '<center dir="rtl">'.$tedad.'عدد جدید ثبت گردید</center>';
fwrite($file_D,"\n");
fclose($file_S);
fclose($file_D);

nekooee
چهارشنبه 08 خرداد 1392, 11:43 صبح
من منتظر کمک دوستان هستم

nekooee
چهارشنبه 08 خرداد 1392, 15:56 عصر
من مشکل رو پیدا کردم و وقتی تو فایل info.txt آخرین خط یک اینتر میزنم و به سطر بعدی میرم عملیات درست انجام میشه.
ولی نمیدونم چه میشه کرد بدون اون اینتر آخر هم درست عمل کنه. ؟

Tarragon
چهارشنبه 08 خرداد 1392, 16:27 عصر
سلام
بنظرم اگر file_get_contents استفاده کنید بهتره آخه بهتر می فهمید چی به چیه (البته من اینجوریم)بعد با explode خطوط رو از هم جدا کنید و کاری رو که آقا مهرداد گفتند به راحتی انجام بدید.

nekooee
چهارشنبه 08 خرداد 1392, 16:50 عصر
درسته روش ایشون خیلی بهتر هست. ولی من اخلاقی دارم یک کد که مینویسم و درست عمل نمیکنه دلم می خواد دلیلش رو بفهمم! شاید اشتباه باشه ولی می خوام بدونم وقتی خط به خط کد درست هست چرا نتیجه اشتباه میشه. و چرا باید آخرش یک اینتر خالی بزنیم تا درست عمل کنه!
البته با مقایسه دو آرایه نمیدونم میشه فهمید که چند شماره جدید ذخیره شده یا نه...
در هر صورت تجربه مفیدی برام بود. ممنون

MMSHFE
پنج شنبه 09 خرداد 1392, 08:36 صبح
این کد رو تست کنید:


//تنظیمات
$filename_S = 'info.txt'; // نام فایل مبدأ را وارد کنید
$filename_D = 'output.txt'; // نام فایل مقصد را وارد کنید
$numbers = array();
array_push($numbers, file($filename_D));
$count = count($numbers);
array_push($numbers, file($filename_S));
$numbers = array_map('trim', $numbers);
$numbers = array_unique($numbers);
$count = count($numbers) - $count;
echo '<div align="center" dir="rtl">' . $count . 'عدد جدید ثبت گردید</div>' . PHP_EOL;
$fp = fopen($filename_D, 'w');
foreach($numbers as $number) {
fwrite($fp, $number . PHP_EOL);
}
fclose($fp);

علت اینکه باید یک Enter اضافه میزدین تا کد شما هم درست کار کنه اینه که توی بقیه سطرها آخرش کارکتر New Line وجود داره ولی سطر آخر نداره و درنتیجه سطر آخر با بقیه سطرها فرق میکنه و بخاطر همین تکراری درنظر نمیگیره. برای حلش هم شما باید ابتدا مقدار سطرها رو با trim تغییر بدین تا کارکترهای New Line و Space و... از ابتدا و انتهاش حذف بشه و بعد مقایسه کنید.

nekooee
پنج شنبه 09 خرداد 1392, 15:04 عصر
خیلی منون کد شما رو دارم مطالعه میکنم ببینم چه کار کردین.
فقط در مورد خودم اتفاقا یکی دیگه از دوستان هم گفتن از trim استفاده کن ولی من تو کدم فکر کنم اشتباه ازش استفاده کردم چون هر بار اینتر میزدم تمام شماره ها رو دوباره میزد!
باز هم از اینکه وقت گذاشتید برام ممنون

nekooee
پنج شنبه 09 خرداد 1392, 15:19 عصر
کد شما خیلی جالب بود ولی مشکلی که داره تمام محتویات فایل اول رو میریزه تو آرایه نامبر اما فقط شماره تلفن ها رو باید جدا کنه و بریزه. اینجا اون شرط preg_match روکجای دستور باید قرار بدیم؟

MMSHFE
جمعه 10 خرداد 1392, 11:37 صبح
خوب شما نگفته بودین توی فایلها چیزی بجز شماره هم هست. این کد رو تست کنید:


//تنظیمات
$filename_S = 'info.txt'; // نام فایل مبدأ را وارد کنید
$filename_D = 'output.txt'; // نام فایل مقصد را وارد کنید
$numbers = array();
array_push($numbers, file($filename_D));
$count = count($numbers);
array_push($numbers, file($filename_S));
$numbers = array_map('trim', $numbers);
foreach($numbers as $index => $number) {
if(!preg_match('#^09[\d]{9,13}$#', $number)) {
unset($numbers[$index]);
}
}
$numbers = array_unique($numbers);
$count = count($numbers) - $count;
echo '<div align="center" dir="rtl">' . $count . 'عدد جدید ثبت گردید</div>' . PHP_EOL;
$fp = fopen($filename_D, 'w');
foreach($numbers as $number) {
fwrite($fp, $number . PHP_EOL);
}
fclose($fp);