اذهب إلى المحتوى

السؤال

Recommended Posts

  • 0
نشر

فعلا استخدام حلقة for loop غير جيده في حفظ البيانات بسبب اداء الابلكيشن ساطرح عليك الحل ببساطه لتحسين الكود الخاص بك
ساعطيك مثال عملي من مشروع كنت اعمل عليه وطلب مني تحسين اداء المشروع 
في الكود الاول هنا 

 for ($i = 0; $i < count($request->titals_ar); $i++) {
   $standard = new StandardSpecification();
   $standard->title_en = $request->titals_en[$i];
   $standard->title_ar = $request->titals_ar[$i];
   $standard->value_ar = $request->values_ar[$i];
   $standard->value_en = $request->values_en[$i];
   $standard->product_id = $product->id;
   $standard->save();
}

هذه الكود  يستخدم حلقة for لتكرار عملية إنشاء وحفظ سجلات StandardSpecification، وعلى الرغم من أنه يقوم بالوظيفة المطلوبة، إلا أنه يأتي مع بعض السلبيات التي تؤثر علي الاداء :

أداء أقل الحلقة for قد تكون أقل كفاءة من حيث الأداء مقارنة بالطرق الأخرى التي ساطرحها عليك ايضا، خاصةً عند التعامل مع مجموعات كبيرة من البيانات. يمكن أن تؤدي التكرارات المتكررة إلى تأثير سلبي على أداء التطبيق.

زيادة في الكود والتكرار: يتطلب استخدام الحلقة for كتابة المزيد من الكود مقارنة بالحلول البديلة ، وهذا قد يؤدي إلى زيادة في التكرار وتعقيد الكود.

أقل قابلية للتوسع وإعادة الاستخدام الكود المكتوب بالحلقة for  يكون أقل قابلية للتوسع وإعادة الاستخدام بسبب التعلق القوي بالبيانات الخاصة بالحلقة والتكرارات. إذا تغيرت هيكلة البيانات أو تم تحديثها، فقد يتطلب تعديل كبير في الكود.

انظر للكود الثاني 
 

$standards = [];
$standards = array_map(function ($i) use ($request, $product) {
    return [
        'title_en' => $request->titals_en[$i],
        'title_ar' => $request->titals_ar[$i],
        'value_ar' => $request->values_ar[$i],
        'value_en' => $request->values_en[$i],
        'product_id' => $product->id,
        'created_at' => now(),
        'updated_at' => now(),
    ];
}, range(0, count($request->titals_ar) - 1));

 استخدام array_map يمكن أن يؤدي إلى أداء محسن مقارنة بالحلقة for، خاصةً عند التعامل مع مجموعات كبيرة من البيانات. الدالة array_map تنفذ التحويل على كل عنصر في المصفوفة في مرة واحدة، مما يقلل من الوقت اللازم للتكرار.

كتابة أقل  باستخدام array_map، يمكنك كتابة أقل كمية من الكود مقارنة بالحلقة for، وذلك بفضل الاستخدام الفعال للدالة والتحويل المطبق على المصفوفة ككل.

قابلية للتوسع وإعادة الاستخدام الكود المكتوب باستخدام array_map يكون أكثر قابلية للتوسع وإعادة الاستخدام بسبب استخدام الدالة لتحويل المصفوفة. يمكنك إعادة استخدام الدالة بسهولة في امور أخرى.

وضوح وقراءة أفضل الكود باستخدام array_map يكون أكثر وضوحًا وسهولة في القراءة، حيث يوفر الكود البسيط والمباشر معالجة مجموعة البيانات بشكل أكثر وضوحًا.

  • 0
نشر
بتاريخ الآن قال Taha Khalid:

فعلا استخدام حلقة for loop غير جيده في حفظ البيانات بسبب اداء الابلكيشن ساطرح عليك الحل ببساطه لتحسين الكود الخاص بك
ساعطيك مثال عملي من مشروع كنت اعمل عليه وطلب مني تحسين اداء المشروع 
في الكود الاول هنا 

 for ($i = 0; $i < count($request->titals_ar); $i++) {
   $standard = new StandardSpecification();
   $standard->title_en = $request->titals_en[$i];
   $standard->title_ar = $request->titals_ar[$i];
   $standard->value_ar = $request->values_ar[$i];
   $standard->value_en = $request->values_en[$i];
   $standard->product_id = $product->id;
   $standard->save();
}

هذه الكود  يستخدم حلقة for لتكرار عملية إنشاء وحفظ سجلات StandardSpecification، وعلى الرغم من أنه يقوم بالوظيفة المطلوبة، إلا أنه يأتي مع بعض السلبيات التي تؤثر علي الاداء :

أداء أقل الحلقة for قد تكون أقل كفاءة من حيث الأداء مقارنة بالطرق الأخرى التي ساطرحها عليك ايضا، خاصةً عند التعامل مع مجموعات كبيرة من البيانات. يمكن أن تؤدي التكرارات المتكررة إلى تأثير سلبي على أداء التطبيق.

زيادة في الكود والتكرار: يتطلب استخدام الحلقة for كتابة المزيد من الكود مقارنة بالحلول البديلة ، وهذا قد يؤدي إلى زيادة في التكرار وتعقيد الكود.

أقل قابلية للتوسع وإعادة الاستخدام الكود المكتوب بالحلقة for  يكون أقل قابلية للتوسع وإعادة الاستخدام بسبب التعلق القوي بالبيانات الخاصة بالحلقة والتكرارات. إذا تغيرت هيكلة البيانات أو تم تحديثها، فقد يتطلب تعديل كبير في الكود.

انظر للكود الثاني 
 

$standards = [];
$standards = array_map(function ($i) use ($request, $product) {
    return [
        'title_en' => $request->titals_en[$i],
        'title_ar' => $request->titals_ar[$i],
        'value_ar' => $request->values_ar[$i],
        'value_en' => $request->values_en[$i],
        'product_id' => $product->id,
        'created_at' => now(),
        'updated_at' => now(),
    ];
}, range(0, count($request->titals_ar) - 1));

 استخدام array_map يمكن أن يؤدي إلى أداء محسن مقارنة بالحلقة for، خاصةً عند التعامل مع مجموعات كبيرة من البيانات. الدالة array_map تنفذ التحويل على كل عنصر في المصفوفة في مرة واحدة، مما يقلل من الوقت اللازم للتكرار.

كتابة أقل  باستخدام array_map، يمكنك كتابة أقل كمية من الكود مقارنة بالحلقة for، وذلك بفضل الاستخدام الفعال للدالة والتحويل المطبق على المصفوفة ككل.

قابلية للتوسع وإعادة الاستخدام الكود المكتوب باستخدام array_map يكون أكثر قابلية للتوسع وإعادة الاستخدام بسبب استخدام الدالة لتحويل المصفوفة. يمكنك إعادة استخدام الدالة بسهولة في امور أخرى.

وضوح وقراءة أفضل الكود باستخدام array_map يكون أكثر وضوحًا وسهولة في القراءة، حيث يوفر الكود البسيط والمباشر معالجة مجموعة البيانات بشكل أكثر وضوحًا.

شكرا لك انا فهمت الفرق بين الطريقتين ولاكن احس ان الكود الثاني متقدم كثير

  • 0
نشر
بتاريخ الآن قال يوسف محمد49:

شكرا لك انا فهمت الفرق بين الطريقتين ولاكن احس ان الكود الثاني متقدم كثير

نعم الكود الثاني هو الافضل واكثر تقدما اذا كنت مبتدئ سيكون فهمه اصعب وانصحك ان تشترك في دورة اكاديمية حسوب لتعلم php

ستاخذك من البدايه الي النهايه 

  • 0
نشر

نعم هناك طريقة فى لارافيل تستطيع ان تضيف بيانات جديدة فى جملة واحده فقط دون الحاجة الى حلقة مكررة.

اولا فى كود ال html يمكنك اضافة inputs لها نفس الاسم وتنتهى باقواس المصفوفة مثل هذا الكود

<input type="text" name="city[0][name]">
<input type="text" name="city[0][code]">

<input type="text" name="city[1][name]">
<input type="text" name="city[1][code]">

<input type="text" name="city[2][name]">
<input type="text" name="city[2][code]">

هنا ستجد اننى قمت بكتابة 6 مدخلات لنشرح الكود معا.

  • فى جميع المدخلات ستجد انى قمت بتسميتهم ب city[index][attribute]   ستجد ان ال index هو رقم العنصر فى المصفوف وال attribute هو الخاصية لهذا العنصر 
  • لنفرض ان المدينة لها اسم و كود مختصر لها . اذا كما فى الكود المرفق اول عنصرين هما لاول مدينة و هو الاسم لها و الكود الخاص بها.
  • وهكذا اذا اردت اضافة اكثر من مدينة ساقوم باضافة عنصرين اخرين مع التاكد من تغير ال index لها .

هكذا قمنا بالانتهاء من الواجهة الامامية. لنبدا بجزء الواجهة الخلفية .

فى ال controller الخاص بلارافيل فى ال request سنجد انه يوجد مصفوفة اسمها city قد تم ارسالها من الواجهة الامامية ولنرى محتوى هذه المصفوفة معا.

$city = $request->city;

/* 
[
    ['name'=>'مدينة 1', 'code'=> 'c1'],
    ['name'=>'مدينة 2', 'code'=> 'c2'],
    ['name'=>'مدينة 3', 'code'=> 'c3'],
]
*/

ستجد انها تتكون من مصفوفة رئيسية بداخلها عدة مصفوفات بعدد المدخلات التى قمت بادخالها فى الواجهة الامامية .

لناتى لطريقة ادخالها فى قاعدة البيانات .

يمكنك استخدام دالة insert لاضافة جميع هذه البيانات بطريقتين سواء كنت تستخدم Eloquent او Query Builder كما فى المثال التالى.

City::insert($city); // Eloquent
DB::table('cities')->insert($city); // Query Builder 

 

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...