PDA

View Full Version : راهنمایی در الگوریتم کم کردن مجموعه اعداد از هم (حل شد)



kimidoonekekie
شنبه 22 تیر 1392, 02:46 صبح
سلام .

خسته نباشید.


در دیتا بیسم دو تا ستون دارم ، ستون اول نگه دارنده اعداد ثابت از 1 تا 30 هست.

و ستونی در جدول دیگر نگه دارنده اعدادی هست که توسط کاربر به این جدول اضاف می شوند ، تعدادشان بین 1 تا 30 تا است و مقادیرشان نیز بین 1 تا 30 می باشد.

مثلا 1 و 2و 3

اینها عدد صحیح می باشند.
-----------------------
نیاز به راهنمایی در زمینه الگوریتمی دارم که عددهای موجود در ستون دوم را از ستون اول حذف کند و باقی را چاپ کند.
در مورد مثال ذکر شده اعداد از 4 تا 30 چاپ شوند.

از دو حلقه ی فور استفاده کرده ام ،که در حلقه ی داخلی مقایسه انجام بشه ، اما چون نتایج تک تک مقایسات باید با هم or بشه و این امکانش نیست به جواب نرسیدم.

پیشنهادی برام دارید؟

hamedfarahabady
شنبه 22 تیر 1392, 03:48 صبح
به نظرم اگه بیای ستون اول رو در یک ارایه ذخیره کنی و ستون دوم رو هم همین طور بعد با حلقه تساوی بین درایه های آرایه رو چک کنی و با یک دستور if ازش خروجی بگیری راهکار خوبی باشه

kimidoonekekie
شنبه 22 تیر 1392, 12:16 عصر
به نظرم اگه بیای ستون اول رو در یک ارایه ذخیره کنی و ستون دوم رو هم همین طور بعد با حلقه تساوی بین درایه های آرایه رو چک کنی و با یک دستور if ازش خروجی بگیری راهکار خوبی باشه



ستون دوم رو واکشی کردم
$result=mysql_query("SELECT joz FROM selected",$myconn);

چطوری اینو توآرایه بریزم ؟؟؟؟

MMSHFE
شنبه 22 تیر 1392, 12:28 عصر
یک مثال:


<?php
$array1 = array();
$part1 = mysql_query('SELECT `id` FROM `table1`');
if($part1 && mysql_num_rows($part1) > 0) {
while($part1item = mysql_fetch_assoc($part1)) {
$array1[] = $part1item['id'];
}
}

$array2 = array();
$part2 = mysql_query('SELECT `id` FROM `table2`');
if($part2 && mysql_num_rows($part2) > 0) {
while($part2item = mysql_fetch_assoc($part2)) {
$array2[] = $part2item['id'];
}
}

foreach($array1 as $key => $array1item) {
if(in_array($array1item, $array2)) {
unset($array1[$key]);
}
}
$array1 = array_values($array1);
?>

kimidoonekekie
شنبه 22 تیر 1392, 13:47 عصر
یک مثال:


<?php
$array1 = array();
$part1 = mysql_query('SELECT `id` FROM `table1');
if($part1 && mysql_num_rows($part1) > 0) {
while($part1item = mysql_fetch_assoc($part1)) {
$array1[] = $part1item['id'];
}
}

$array2 = array();
$part2 = mysql_query('SELECT `id` FROM `table2');
if($part2 && mysql_num_rows($part2) > 0) {
while($part2item = mysql_fetch_assoc($part2)) {
$array2[] = $part2item['id'];
}
}

foreach($array1 as $key => $array1item) {
if(in_array($array1item, $array2)) {
unset($array1[$key]);
}
}
$array1 = array_values($array1);
?>


ممنون.این کد تست شده ؟ مشکلی نداره ؟
تاجایی ک دیدم نیازی نبود تغییری توش بدم ، فقط کوئری ها رو با اسم جداول و ستون خودم جایگزین کردم.

اما نمیدونم این پیغام خطا رو چرا داده ؟
syntax error, unexpected T_VARIABLE
آیا باید کار خاصی میکردم ؟

MMSHFE
شنبه 22 تیر 1392, 13:56 عصر
همیشه وقتی خطا میگیرین، شماره خط رو بنویسید. الآن دقیقاً نمیدونم از کدوم خط خط تولید شده. کدی که من بهتون دادم خطا نداشت. احتمالاً موقع تغییرات، خطایی رخ داده. کد خودتون رو بگذارین بررسی کنیم.

kimidoonekekie
شنبه 22 تیر 1392, 14:15 عصر
خطا رو از اولین خط کد گرفته


$array1 = array();
$part1 = mysql_query('SELECT `joz` FROM `selected');
if($part1 && mysql_num_rows($part1) > 0) {
while($part1item = mysql_fetch_assoc($part1)) {
$array1[] = $part1item['id'];
}
}

$array2 = array();
$part2 = mysql_query('SELECT `joz` FROM `quran');
if($part2 && mysql_num_rows($part2) > 0) {
while($part2item = mysql_fetch_assoc($part2)) {
$array2[] = $part2item['id'];
}
}

foreach($array1 as $key => $array1item) {
if(in_array($array1item, $array2)) {
unset($array1[$key]);
}
}
$array1 = array_values($array1);
echo $array1[0];

-------------------------------------------
البته نمیخام مسئله رو دوتاش کنم .اما بنظرم مطرح کردن اصل موضوع در حل خود موضوع میتونه کمک کننده باشه
این یه اپ هست که میخام ختم قرآن مجازی رو توش پیاده سازی کنم.
(کاربر میتونه نام خودش و جز انتخابیش رو توسط فرم ارسال کنه ، فرم باید طوری تغییر کنه که به کاربر بعدی جزهای ثبت نشده رو نشون بده )
که اومدم جز 1 تا 30 رو تو ستون joz از جدول quran گذاشتم.
و بعد بواسطه ی فرمی ک اطلاعاتو دریافت میکنه و درجدول دیگه ای به اسم selected جز ثبت شده توسط هر کاربر رو در ستون jozدرج میکنه.

----------------
فرمی که به کاربر نشون داده میشه باید فقط جزهایی رو که کسی برنداشته نشون بده ، این کارو میخام با چک باکس و با این الگوریتمی ک مد نظرمه انجام بدم.
.
آقای MMSHFE ممنون از توجهتون

MMSHFE
شنبه 22 تیر 1392, 14:30 عصر
اینو تست کنید:


<?php
$array1 = range(1, 30);

$array2 = array();
$part2 = mysql_query('SELECT `joz` FROM `selected`');
if($part2 && mysql_num_rows($part2) > 0) {
while($part2item = mysql_fetch_assoc($part2)) {
$array2[] = $part2item['joz'];
}
}

foreach($array1 as $key => $array1item) {
if(in_array($array1item, $array2)) {
unset($array1[$key]);
}
}
$array1 = array_values($array1);
print_r($array1);
?>

دلیل خطایی که میگرفتین این بوده که شما گفتین خونه id رو استخراج کنه درحالی که اسم فیلد توی جدولتون joz هست. بنابراین، array1 خالیه و خونه صفر نداره که echo کنید.

MMSHFE
شنبه 22 تیر 1392, 14:35 عصر
اول باید کد اجزاء رو توی array1 بگذارین و بعد، اجزاء انتخاب شده رو توی array2 اما از اونجا که قرآن همیشه 30 جزء داره، نیازی نیست از دیتابیس بخونید. فقط اجزاء انتخاب شده رو از جدول selected کافیه. البته یک راه دیگه هم هست:


<?php
$result = mysql_query('SELECT `joz` FROM `quran` WHERE (`joz` NOT IN (SELECT `joz` FROM `selected`)) ORDER BY `id`');
$joz = array();
if($result && mysql_num_rows($result) > 0) {
while($row = mysql_fetch_assoc($result)) {
$joz[] = $row['joz'];
}
}
print_r($joz);
?>

یعنی از خود MySQL بخواین رکوردهایی از جدول quran رو برگردونه که توی جدول selected نیست. اینطوری خیلی سریعتر میشه.

kimidoonekekie
شنبه 22 تیر 1392, 15:25 عصر
اول باید کد اجزاء رو توی array1 بگذارین و بعد، اجزاء انتخاب شده رو توی array2 اما از اونجا که قرآن همیشه 30 جزء داره، نیازی نیست از دیتابیس بخونید. فقط اجزاء انتخاب شده رو از جدول selected کافیه. البته یک راه دیگه هم هست:


<?php
$result = mysql_query('SELECT `joz` FROM `quran` WHERE (`joz` NOT IN (SELECT `joz` FROM `selected`)) ORDER BY `id`');
$joz = array();
if($result && mysql_num_rows($result) > 0) {
while($row = mysql_fetch_assoc($result)) {
$joz[] = $row['joz'];
}
}
print_r($joz);
?>

یعنی از خود MySQL بخواین رکوردهایی از جدول quran رو برگردونه که توی جدول selected نیست. اینطوری خیلی سریعتر میشه.

راه حل دوم برام خیلی جالب تر بود ،وکد و منطقشو درک کردم البته به جز خط 6 کد که یکم متوجه نشدم.
این کد اسکیوال رو هم در پی اچ پی مای ادمین اجرا کردم ، جواب موردنظر رو میده .

برنامه رو هم بدون کدای جدید تست کردم ، خطایی نداره ، اما با اضاف کردن این چند خط کد خطای "unexpected T_VARIABLE" رومیده .
نمیفهمم مشکل از کجاست... از اولین خط کدای اضاف شده اشکال میگیره...

MMSHFE
شنبه 22 تیر 1392, 15:30 عصر
کد کامل رو بگذارین تا ببینیم مشکل کجاست. منظورتون از خط 6 کدومه؟

kimidoonekekie
شنبه 22 تیر 1392, 17:42 عصر
کد کامل رو بگذارین تا ببینیم مشکل کجاست. منظورتون از خط 6 کدومه؟
منظورم از خط 6
$joz[] = $row['joz'];

کد کامل - خطا در خط 20


//ارتباط با دیتا بیس صحیح است**********
$myconn=mysql_connect("localhost","root","");
if($myconn)
print("");
else
print("شکست در ارتباط");
if(mysql_select_db("quran",$myconn))
echo '';
else echo '<br> ديتا بيس مورد نظر ما وصل نشده</br>';
//**********************

//میخاهیم فقط جزهای باقی مانده را درآرایه قرار داده وچاپ کنیم********

$result = mysql_query('SELECT `joz` FROM `joz` WHERE

(`joz` NOT IN (SELECT `joz` FROM `selected`)) ORDER BY

`radif`');

$joz = array();
if($result && mysql_num_rows($result) > 0) {
while($row = mysql_fetch_assoc($result)) {
$joz[] = $row['joz'];
}
}
print_r($joz);
//فعلا به صورت آزمایشی چاپ میکنیم، بعدا با اندازه آرایه و حلقه فور برای تولید چک باکس های مورد نظر استفاده می شود.


[/LTR]

MMSHFE
یک شنبه 23 تیر 1392, 08:41 صبح
دوست عزیز، وقتی فیلد radif جزو فیلدهایی که انتخاب میکنید نیست (توی کوئری فقط فیلد joz بعد از SELECT نوشته شده)، بنابراین، نمیتونید بر اساس اون. رکوردها رو مرتب کنید. پس یا باید فیلد radif رو هم به فیلدهایی که استخراج میشه، اضافه کنید، یا ORDER BY رو برحسب joz بنویسید. الآن چون کوئری با خطا مواجه شده، هیچی برنگردونده. هیچی هم طبیعتاً خونه joz نداره که بخوایم توی متغیر joz$ بریزیم. متأسفانه من هم حواسم نبود و به خیال اینکه * SELECT نوشته بودم، ORDER BY رو برحسب فیلد id نوشته بودم.

kimidoonekekie
یک شنبه 23 تیر 1392, 19:17 عصر
دوست عزیز، وقتی فیلد radif جزو فیلدهایی که انتخاب میکنید نیست (توی کوئری فقط فیلد joz بعد از SELECT نوشته شده)، بنابراین، نمیتونید بر اساس اون. رکوردها رو مرتب کنید. پس یا باید فیلد radif رو هم به فیلدهایی که استخراج میشه، اضافه کنید، یا ORDER BY رو برحسب joz بنویسید. الآن چون کوئری با خطا مواجه شده، هیچی برنگردونده. هیچی هم طبیعتاً خونه joz نداره که بخوایم توی متغیر joz$ بریزیم. متأسفانه من هم حواسم نبود و به خیال اینکه * SELECT نوشته بودم، ORDER BY رو برحسب فیلد id نوشته بودم.


نکته ای که گفتید رو اصلاح کردم .
هم تو هاست هم لوکال هاست تست کردم ، بازهم همون خطای قبلی(unexpected T_VARIABLE ) و همون جا.

MMSHFE
دوشنبه 24 تیر 1392, 09:14 صبح
لطفاً Team Viewer رو نصب کنید و درحالی که باز شده، نام کاربری و رمز عبور Remote Connection رو برام بفرستین (پیام خصوصی) تا به سیستم شما وصل بشم و همونجا مشکل کدتون رو رفع کنم و شما هم نحوه رفع اینگونه خطاها رو یاد بگیرین.

kimidoonekekie
دوشنبه 24 تیر 1392, 10:15 صبح
لطفاً Team Viewer رو نصب کنید و درحالی که باز شده، نام کاربری و رمز عبور Remote Connection رو برام بفرستین (پیام خصوصی) تا به سیستم شما وصل بشم و همونجا مشکل کدتون رو رفع کنم و شما هم نحوه رفع اینگونه خطاها رو یاد بگیرین.

ممنون.
پ خ شد.

kimidoonekekie
دوشنبه 24 تیر 1392, 10:28 صبح
مشکلم حل شد.

از ظاهر امر اصلا نمیشد ب مشکل داشتن "tab" پی برد.و اینکه باعث خطاهای مربوط بشه .

ممنون ازشما.

MMSHFE
دوشنبه 24 تیر 1392, 11:43 صبح
مشکل این دوستمون با Remote Connection به کمک TeamViewer حل شد. جریان از این قرار بود که فرمت کدشون در ابتدا UTF-8 without BOM نبود و کارکتر Tab که با سایر کدگذاریها درج میشه، توی برخی ادیتورها غیر استاندارده و بعد از اینکه فرمت رو UTF-8 without BOM کردیم، کد رو بازنویسی کردیم و خوشبختانه مشکل رفع شد. بهتره عادت کنید بجای Tab از Space استفاده کنید تا با چنین مشکلاتی مواجه نشین.