دانیال
10 ماه پیش توسط دانیال مطرح شد
7 پاسخ

همفکری برای پیاده سازی یک کوئری

سلام و عرض ادب خدمت اساتید
من یک سایتی دارم اینم تصاویرش :
 تصویر  تصویر تصویر
توضحات :
من دوتا مدل دارم به اسم Questions , NextGeneration
هر کدوم از مدل ها دو تا ستون داره systemid , subjectid
و هر NextGeneration چند تا Question داره
مشکل من الان اینه :
من وقتی توی صفحه میام سلکت میکنم هر چیزی که میخوام . وقتی تعداد رو وارد میکنم سیستم کلی پروسس میکنه
این کد من :

$next_gen = NextGeneration::whereIn('system_id', $request->systems)
                            ->whereIn('subject_id', $request->subjects)
                            ->get();
$matchedQuestionIds = [];
                    $questionCountsTwo=[];

                    foreach ($next_gen as $gen) {
                        $questionCounts[] = [$gen['id'], count($gen['questions']) , $gen['questions']->pluck('id')];

                        $questionCountsTwo[] = count($gen['questions']);

                        if (count($gen['questions']) == $result['next_generation']) {
                            $matchedQuestionIds = $gen['questions']->pluck('id');
                            break;
                        } else {
                            if (count($gen['questions']) == $result['next_generation']) {
                                $matchedQuestionIds = $gen['questions']->pluck('id');
                                break;
                            }
                        }
                    }
if (!empty($matchedQuestionIds)) {
                        $questions = in_array('traditional', $request->question_types) ? $questions->merge($matchedQuestionIds) : $matchedQuestionIds;

                    } else {
                        $res = $this->findPairsDaniel($questionCounts, $result['next_generation']);

                        //$res = $this->find_combinations_with_sum($questionCounts, $result['next_generation']);
                        if(!empty($res)){
                            $randomIndex = array_rand($res);
                            $randomArray = $res[$randomIndex];
                            if (in_array('traditional', $request->question_types)) {
                                $questions = $questions->merge($randomArray[0][2]);
                            } else {
                                $questions = $randomArray[0][2];
                            }
                            foreach (array_slice($randomArray, 1) as $n) {
                                $questions = $questions->merge($n[2]);
                            }
                        }else{

                            $inventory = $this->generateNumberCombinationsRecursive($questionCountsTwo);
                            $minValue = ($this->findClosestNumbers($result['next_generation'], $inventory) == null)? min($inventory):$this->findClosestNumbers($result['next_generation'], $inventory)[0] ;
                            $maxValue = ($this->findClosestNumbers($result['next_generation'], $inventory) == null )?max($inventory):$this->findClosestNumbers($result['next_generation'], $inventory)[1];

                            return [
                                'status' => 'warning',
                                'max' => $maxValue + $result['traditional'],
                                'min' => $minValue + $result['traditional']
                            ];
                        }

                    }

اینم فانکشن هایی که فراخونی میشه :

  public function findPairsDaniel($arrays, $targetSum) {
        $result = [];

        $n = count($arrays);

        // فراخوانی تابع بازگشتی
        $this->findPairsRecursiveDaniel($arrays, $targetSum, 0, $n, [], $result);

        return $result;
    }

    public function findPairsRecursiveDaniel($arrays, $targetSum, $startIndex, $n, $currentCombination, &$result) {
        // بررسی اعداد موجود در ترکیب فعلی
        $sum = array_sum(array_column($currentCombination, 1));
        if ($sum == $targetSum) {
            // افزودن ترکیب به نتیجه
            $result[] = $currentCombination;
            return;
        }

        for ($i = $startIndex; $i < $n; $i++) {
            // ایجاد یک کپی از ترکیب فعلی
            $newCombination = $currentCombination;

            // اضافه کردن ارایه فعلی به ترکیب
            $newCombination[] = $arrays[$i];

            $this->findPairsRecursiveDaniel($arrays, $targetSum, $i + 1, $n, $newCombination, $result);
        }
    }
function generateNumberCombinationsRecursive($numbers, $groupSize=2){

        if(count($numbers) <= $groupSize){
            return [];
        }

        $groups = array_chunk($numbers, $groupSize);

        foreach ($groups as $group) {
            $sums[] = array_sum($group);
        }

        return array_merge($sums, $this->generateNumberCombinationsRecursive($sums, $groupSize));
    }

 public function findClosestNumbers($number, $arr) {
        sort($arr);

        $closestSmaller = $arr[0];
        $closestLarger = $arr[count($arr) - 1];

        foreach ($arr as $val) {
            if ($val < $number && *****number - $val) < *****number - $closestSmaller)) {
                $closestSmaller = $val;
            }
            if ($val > $number && *****number - $val) < *****number - $closestLarger)) {
                $closestLarger = $val;
            }
        }

        return array($closestSmaller, $closestLarger);
    }

سیستم خیلی کند شده و وقتی فانکشن ها هم توی دیتای بالا خونده میشه اصلا هیچی نمیاره بالا و صفحه خالی میده .
هدف من از نوشتن فانکشن ها :‌
یکیش برای اینه که بیاد تمام تعداد سوالات رو بگیره و بیاد به تعداد ارایه ها جمع کنه . مثلا سه تا ارایه دارم [1,2,4,3] که میخوام اینا رو باهم جمع کنه ببینم به اون عدد من میرسه یا نه
مثلا عدد ۱۲ هستش با ارایه بالا
به این صورت عمل کنه
1+2 = 3 , ۴+۳ = ۷ , ۲+۳ =۵ , 1+3 = 4 و مثلا اعداد تموم شد
1+2+3 =6 الی اخر
۱+۲+۳+۴


ثبت پرسش جدید
دانیال
تخصص : PHP BackEnd DEveloper
@daniyal1396m 10 ماه پیش مطرح شد
0

@Raymond @Pouyab @MortezaVaezi @FullStack @hesammousavi

سلام دوستان لطفا این سوال رو بررسی میکنید؟


مرتضی واعظی
تخصص : توسعه دهنده وب
@MortezaVaezi 10 ماه پیش مطرح شد
1

سلام و عرض ادب!

بررسی کدی که ارائه دادید نشان می‌دهد که برخی از بخش‌های آن ناقص هستند و ممکن است باعث ایجاد خطاها و مشکلاتی در سیستم شوند. اما به علت ناقص بودن بخش‌هایی از کد و از دست رفتن برخی جزئیات مهم، دشوار است به طور کامل درک کنم که شما دقیقاً چه مشکلی دارید و چگونه باید آن را حل کنید.

به هر حال، می‌توانم تعدادی نکته را به شما بیان کنم:

  1. در قطعه کدی که ارائه دادید، خطی که if (count($gen['questions']) == $result['next_generation']) نوشته شده است، دو بار تکرار شده است. این نکته بی‌اهمیت به نظر می‌رسد و می‌توان آن را حذف کرد.

  2. در این قسمت از کد if (!empty($matchedQuestionIds)) { ... }، متغیر $questions که قبلاً تعریف نشده است، به کار رفته است. بنابراین ممکن است این قسمت باعث بروز خطاها شود. لازم است که مطمئن شوید که $questions به درستی تعریف و مقداردهی شده است.

  3. در تابع findPairsDaniel، شما از یک آرایه به عنوان پارامتر $arrays استفاده می‌کنید، اما در تمام استفاده‌های دیگر این آرایه را با نام $questionCounts فراخوانی می‌کنید. اطمینان حاصل کنید که نام‌ها درست استفاده شده‌اند و اگر قرار است از نام $questionCounts استفاده کنید، آن را در تمام جاهای لازم به‌روزرسانی کنید.

بهتر است کدهای کامل و جزئیات بیشتری از ساختار داده‌ها و وظیفه‌های مورد انتظارتان ارائه دهید تا بتوانم بهتر کمک کنم.


دانیال
تخصص : PHP BackEnd DEveloper
@daniyal1396m 10 ماه پیش مطرح شد
0

مرسی که راهنمایی کردید درمورد گزینه دومی که عرض کردید من قبلا یه سری کوئسشن گرفتم و میخوام باهم توی یک ارایه برن و ادامه کار خودشو انجام بده

من یه لینک ویدیو میذارم خدمتتون تا بهتر منظورمو برسونم .
این دوتا تصویر یکیش کد هستش و دومی ریسپانس خالی
 تصویراین لینک ویدیویی که گرفتم]2 تصویر


دانیال
تخصص : PHP BackEnd DEveloper
@daniyal1396m 10 ماه پیش مطرح شد
0

@MortezaVaezi لطفا جواب منو بررسی میکنید ؟


مرتضی واعظی
تخصص : توسعه دهنده وب
@MortezaVaezi 10 ماه پیش مطرح شد
1

در اصل اینطوری میشه گفت که وقتی تعداد داده های ارسال می‌ره بالا پاسخی از سمت سرور ارائه نمیشه. درسته؟


دانیال
تخصص : PHP BackEnd DEveloper
@daniyal1396m 10 ماه پیش مطرح شد
مرتضی واعظی
تخصص : توسعه دهنده وب
@MortezaVaezi 10 ماه پیش مطرح شد
0

با توجه به توضیحات شما، مشکلتان به نظر می‌رسد به عدم بهینه‌سازی کد و مدیریت حجم بزرگ داده‌ها برمی‌گردد. برای حل این مشکل، می‌توانید از روش‌ها و تکنیک‌های زیر استفاده کنید:

  1. استفاده از پرس‌وجوی مستقیم: به جای بازیابی تمام رکوردها از جداول مورد نیاز و سپس انجام پردازش در حافظه، سعی کنید پرس‌وجوی مستقیم و بهینه‌تری را انجام دهید. از قابلیت‌های پایگاه داده خود، مانند استفاده از JOIN و WHERE بهینه و صحیح برای بازیابی داده‌های مورد نیاز خود استفاده کنید.

  2. صفحه‌بندی (Pagination): اگر حجم داده‌هایی که دریافت می‌کنید بسیار زیاد است، ممکن است بارگیری همه داده‌ها به مشکل برخورد کند. در این صورت، صفحه‌بندی را به کار ببرید و داده‌ها را به صورت پیشفرض به شما تحویل دهد. با استفاده از مکانیزم صفحه‌بندی، می‌توانید تعداد داده‌هایی که در هر بار درخواست به کاربر ارسال می‌شود را محدود کنید و از بارگیری و پردازش یکباره تمام داده‌ها جلوگیری کنید.

  3. بهینه‌سازی پرس‌وجوها: بررسی و بهینه‌سازی پرس‌وجوهای استفاده شده در کد، می‌تواند تاثیر قابل توجهی در عملکرد کد داشته باشد. مطمئن شوید که شما از ایندکس‌ها و شرایط WHERE بهینه استفاده می‌کنید و عملیات JOIN بهینه‌ترین شکل ممکن را دارد.

  4. بهینه‌سازی الگوریتم‌ها: بررسی الگوریتم‌های استفاده شده در کد خود می‌تو

اند بهبود قابل توجهی در عملکرد برنامه داشته باشد. سعی کنید الگوریتم‌هایی را انتخاب کنید که در مواجهه با حجم بزرگ داده‌ها بهینه عمل کنند.

  1. کش‌سازی (Caching): از روش کش‌سازی برای ذخیره نتایج پرس‌وجوهای قبلی و از نتایج کش شده استفاده کنید. این روش می‌تواند زمان پردازش را به شدت کاهش دهد، زیرا نیازی به اجرای مجدد پرس‌وجوها ندارید و می‌توانید نتایج را مستقیماً از کش بازیابی کنید.

با استفاده از این روش‌ها و بهینه‌سازی‌ها، احتمالاً مشکل کار نکردن کد در مواجهه با حجم بزرگ داده‌ها کاهش خواهد یافت. همچنین، بهتر است همواره به عملکرد کد خود نظارت داشته باشید و در صورت لزوم ابزارهای مانیتورینگ و پروفایلر را برای تحلیل و بهبود عملکرد استفاده کنید.


برای ارسال پاسخ لازم است وارد شده یا ثبت‌نام کنید

ورود یا ثبت‌نام