آرایه در کانستراکت
#1
Lightbulb 
به نام خدا
سلام دوستان امیدوارم حالتون خوب باشه...
امروز قصد داریم راجع به آرایه در کانستراکت صبحت کنیم. شیء آرایه (Array) قادر هست مقادیر اطلاعات شامل متن و عدد رو در خودش ذخیره و نگهداری کنه. ساز و کار آرایه در کانستراکت کاملاً مشابه ساز و کار آرایه در زبان های رایج برنامه نویسی هست و چیز جداگانه و جدیدی در خودش نداره. در زبان های برنامه نویسی ساختار آرایه (Array) برای جلوگیری از ساختن تعداد زیادی متغیر هست و در واقع با ساختن یک آرایه میتونیم مقادیر زیادی رو در داخلش ذخیره کنیم و با یک تیر چند نشون بزنیم:
  • * کدی که نوشتیم بسیار خواناتر و ساده تر میشه. 
  • * با استفاده از ساختار آرایه به جای ساختن چندین عدد متغیر خانه های کمتری از حافظه اشغال میشن و باعث میشه پرفرمنس (Performance) برنامه افزایش پیدا کنه.
  • از یک روش اصولی برای ذخیره سازی مقادیر موردنظرمون به جای روش غیراصولی و غلط ساختن چندین عدد متغیر استفاده کردیم.

مفهوم بُعد (Dimension) در آرایه ها:

آرایه در کانستراکت میتونه از یک بعد تا سه بعد رو شامل بشه. شاید بپرسین چرا برای یک آرایه بعد متصور میشیم و اصلاً معنای این بُعد (Dimension) چی هست؟ چرا به یک آرایه میگیم تک بعدی و به یک آرایه میگیم سه بعدی؟ در واقع پاسخ این سوال در درک معماری خانه های حافظه رایانه نهفته هست. اجازه بدین با طریقه ذخیره شدن مقادیر یک آرایه ساده یک بعدی در خانه های حافظه کامپیوتر آشنا بشیم. شکل زیر در واقع آرایش مقادیر یک آرایه یک بعدی (تک بعدی) به نام x رو در خانه های حافظه نمایش میده:
[تصویر:  array.gif]
هر آرایه چه یک بعدی باشه چه چند بعدی شامل چندین عنصر (Element) میشه. در واقع هر عنصر در آرایه همون مقادیری هست که در آرایه ذخیره کردیم. همونطور که در شکل مشخصه این آرایه یک بعدی که تعریف کردیم تنها شامل چهار عنصر هست پس میتونه چهار مقدار متفاوت رو درون خودش ذخیره کنه. برای مشخص کردن هر عنصر آرایه میتونیم طبق شکل خانه های حافظه به راحتی اون رو مشخص کنیم.  اولین عنصر آرایه من به شکل x[0] تعریف میشه. دقت کنین که شمارش ابعاد خانه های یک آرایه تک بعدی یا چند بعدی با عدد صفر شروع میشه. پس یعنی خانه های یک آرایه تک بعدی چهار عنصری عبارت هستن از 0 و 1 و 2 و 3. در ضمن به شماره ای که به خانه ها در هر بعد اختصاص پیدا میکنه شاخص (Index) میگیم. پس یعنی این آرایه که تعریف کردیم 4 شاخص داره.
  شاید اگر یکم دقت کرده باشین مفهوم بُعد رو قبل از اینکه من بیان کنم بهش رسیده باشین. ولی اگر نفهمیدین عیبی نداره ادامه مطلب رو بخونین!
حالا فرض کنین می خوام یک آرایه دو بعدی به نام A رو تعریف کنم. آرایش یک آرایه دو بعدی در خانه های حافظه به این شکل میشه:
[تصویر:  array2.gif]
همونطور که در سمت چپ تصویر مشخصه آرایه دو بعدی ما در خانه های حافظه یک رایانه به این شکل تعریف میشه. یعنی ما قادر هستیم برای تشخیص یک مقدار یا عنصر آرایه (خانه حافظه) از یک سیستمی مثل دستگاه مختصات دکارتی استفاده کنیم. یعنی من میتونم عنصر «13» آرایه دو بعدی A رو به شکل A[1,3] گزارش کنم. پس حالا مفهوم بعد در آرایه رو متوجه شدین. در واقع در یک آرایه تک بعدی تنها از یک مشخصه برای مشخص کردن عناصر آرایه استفاده میشه اما در یک آرایه چند بعدی ما چندین مشخصه برای تعیین کردن یک عنصر آرایه داریم.
شکل زیر نمایش دهنده آرایش یک آرایه سه بعدی می باشد:
[تصویر:  3d_array.png]
نکته: دقت کنین که بعد اول با X، بعد دوم با Y و بعد سوم با Z نمایش داده میشه. 
طریقه تعریف یک آرایه تک بعدی یا چند بعدی:
همونطور که گفته شد یک آرایه در کانستراکت میتونه یک تا سه بعد باشه. اما اگر شما مقدار صفر رو برای ابعاد (Dimensions) آرایه تعریف کنید، مفسر کانستراکت اون آرایه رو یک آرایه خالی و بدون هیچ مقدار تلقی میکنه. 
شاید تحلیل یک آرایه سه بعدی برای ما دشوار به نظر برسه. پس میتونیم از آرایه های تک بعدی و دو بعدی استفاده کنیم. اما چطور؟ 
  • برای تعریف یک آرایه تک بعدی (یک بعدی) ابعاد رو به شکل زیر تعریف می کنیم:
کد:
N × 1 × 1
(در واقع N تعداد عناصر یا مقادیری است که میخوایم در آرایه تک بعدی خودمون نگهداری کنیم.)
  • برای تعریف یک آرایه دو بعدی ابعاد رو به شکل زیر تعریف می کنیم:
کد:
N × M × 1
(در اینجا حاصلضرب N و M تعداد عناصر یا مقادیری هست که قصد داریم در آرایه دو بعدی خودمون نگهداری کنیم.)
خُب حالا شاید بپرسین تعریف یک آرایه تک بعدی بهتره یا دو بعدی؟ جواب اینه که بستگی به شما داره! فرض کنین قراره 12 مقدار رو در یک آرایه نگهداری کنیم. برای این کار میتونیم آرایه تک بعدی، دو بعدی و سه بعدی تعریف کنیم. همونطور که گفتم چون تحلیل یک آرایه سه بعدی ممکنه دشوار به نظر برسه پس بیخیالش میشیم و به آرایه یک بعدی و دو بعدی می پردازیم. 
اگر بخوام این دوازده مقدار رو در یک آرایه تک بعدی تعریف کنم ابعاد رو باید به شکل زیر متصور بشم:
کد:
12 × 1 × 1
حالا اگر بخوام این دوازده مقدار رو در یک آرایه دو بعدی ذخیره کنم چطور؟ خُب چون 12 به دو بخش پذیره پس میتونم عدد N رو 2 و عدد M رو 6 در نظر بگیرم با برعکس. همونطور که در طریقه تعریف یک آرایه دو بعدی گفتم باید حاصلضرب N و M برابر باشه با تعداد مقادیری که میخوایم در آرایه ذخیره کنیم که اینجا به خاطر بخش پذیر بودن عدد 12 به 2 این شرط برقراره. پس ابعاد آرایه دو بعدی خودم رو به این شکل تعریف میکنم:
کد:
2 × 6 × 1 
یا
6 × 2 × 1
(حواستون هست که 1×2×6 با 1×6×2 متفاوته)
در نهایت بنده تصمیم می گیرم که یک آرایه دو بعدی بسازم و 12 مقدار موردنظرم رو داخلش ذخیره کنم. پس از اکشن Set Size شیء آرایه استفاده می کنم و ابعاد رو به شکل زیر تعریف می کنم:
کد:
X : 6
Y : 2
Z : 1
موفق شدم یک آرایه دو بعدی 12 عنصری ایجاد کنم. ساختار این آرایه دو بعدی من به این شکل میشه:
[تصویر:  myarray.png]
دقت کنین همونطور که در ابتدا گفتم شمارش ابعاد خانه های یک آرایه تک بعدی یا چند بعدی از صفر شروع میشه.
حالا فرض کنین میخوام مقدار "yes" رو در یکی از خانه های این آرایه دو بعدی (مثلاً خانه 2,0) ذخیره کنم. چون آرایه من دو بعدی هست کافیه اکشن Set at XY رو انتخاب کنم و مقدار موردنظرم رو در خانه 2 و 0 به شکل زیر تعریف کنم: (اگر آرایه من یک بعدی بود باید اکشن Set at X رو انتخاب میکردم و اگر سه بعدی بود اکشن Set at XYZ رو باید انتخاب می کردم.)
کد:
X : 2
Y : 0
Value : "yes"
حالا فرض کنین میخوام مقدار یک تکست رو به مقدار ذخیره شده در عنصر (2,0) تغییر بدم. کافیه اکشن Set Text To رو انتخاب کنم و این عبارت رو در فیلد Text وارد کنم:
کد:
Array.At(2,0)

توضیحات راجع به کاندیشن های شیء آرایه:
  • کاندیشن Compare at X برای بررسی برابر بودن یک عنصر از آرایه تک بعدی با مقداری دلخواه به کار می رود.
  • کاندیشن Compare at XY برای بررسی برابر بودن یک عنصر از آرایه دو بعدی با مقداری دلخواه به کار می رود.
  • کاندیشن Compare at XYZ برای بررسی برابر بودن یک عنصر از آرایه سه  بعدی با مقداری دلخواه به کار می رود.
  • کاندیشن Contains Value برای بررسی وجود یک مقدار در تمامی خانه ها (عناصر) یک آرایه تک بعدی یا چند بعدی به کار می رود.
  • دو کاندیشن For each element و Compare Current Value در ساختار حلقه For each به کار می رود.

 Manipulation (دستکاری) یک آرایه تک بعدی یا چند بعدی :
فرض کنین ما یک آرایه دو بعدی شامل 4 عنصر با ابعاد 1×2×2 ایجاد کردیم. اما در حین ایونت نویسی می بینیم که 4 عنصر برای پیاده سازی پروژه مون خیلی کمه و به عناصر بیشتری نیاز داریم. آیا باید کل ایونت نویسی های بخش های مرتبط با آرایه رو از اول انجام بدیم؟ دست نگه دارین! شما میتونین با اکشن های Maniuplation شیء آرایه بعد از ایجاد کردن آرایه تون عناصرش رو مرتب کنین، حذف کنین و همچنین عناصر جدیدی اضافه کنین.
اکشن های Manipulation (دستکاری) شیء آرایه در یک بُعد مشخص (X,Y,Z | بعد اول، دوم و سوم):
  • * اکشن Delete برای حذف یکی از شاخص ها (Indexes) یک بُعد مشخص از آرایه تک بعدی یا چند بعدی ما به کار میره. راجع به اینکه شاخص یا ایندکس چی هست در بخش مفهوم بُعد در آرایه صبحت کردم. این اکشن شامل دو پارامتر Index و Axis هست. فرض کنین قصد داریم شاخص شماره 1 بُعد اول (X) یک آرایه تک بعدی شامل شش عنصر رو حذف کنیم. پس باید در فیلد Index عدد 1 و برای پارامتر Axis عبارت "X" رو انتخاب کنیم. به این دلیل پارامتر Axis رو X تعیین کردم چون قصد داریم شاخص اول از بُعد اول رو حذف کنیم و از طرفی چون آرایه موردنظرمون تک بعدی هست انتخاب دیگه ای نداریم. دقت کنین که اجرای این اکشن بر روی یک آرایه تک بعدی باعث حذف تنها یک عنصر و بر روی یک آرایه دو بعدی باعث حذف یک ردیف از عناصر آرایه میشه. به طور دقیقتر بعد از اجرای این اکشن بر روی یک آرایه دو بعدی تعداد عناصری که از آرایه حذف میشن برابر هست با تعداد شاخص های بُعد مخالف بُعدی که انتخاب کردیم توی اکشن. تعداد نهایی عناصر آرایه هم از این فرمول به دست میاد:
    کد:
    (تعداد شاخص های بُعد دوم) - (تعداد شاخص های بعد اول × تعداد شاخص های بعد دوم) 

  •  اکشن Insert برای وارد کردن مقداری مشخص در یکی از شاخص های بُعدی خاص به کار میره. این اکشن شامل سه پارامتر Value، Index و Axis می باشد. فرض کنین قصد داریم مقدار "test" رو در شاخص پنجم یک آرایه تک بعدی شامل هفت عنصر رو وارد کنیم. پس باید در فیلد Value عبارت "test"، در فیلد Index عدد 5 و پارامتر Axis رو "X" انتخاب کنیم. به این دلیل پارامتر Axis رو X تعیین کردم چون قصد داریم شاخص پنجم از بُعد اول رو بهش مقدار بدیم. دقت کنین که شاخصی که قصد داریم بهش مقداری بدیم حتماً لازم نیست از قبل در آرایه تک بعدی یا چند بعدی ما وجود داشته باشه و میتونیم یک شاخص جدید با مقداری جدید به آرایه مون اضافه کنیم.
    اگر یک شاخص جدید به یک آرایه تک بعدی توسط این اکشن اضافه کنیم یک عنصر و اگر یک شاخص به یک آرایه دو بعدی توسط این اکشن اضافه کنیم به اندازه یک ردیف عنصر ایجاد خواهد شد. به طور دقیقتر تعداد عناصر جدیدی که در آرایه دو بعدی خواهیم داشت برابره با تعداد شاخص های بُعد مخالف (یعنی مثلاً اگر بعد X رو انتخاب کردیم میشه Y). تعداد عناصر نهایی هم از فرمول زیر قابل محاسبه است:
    کد:
    (تعداد شاخص های بعد اول × تعداد شاخص های بعد دوم) + (تعداد شاخص های بُعد دوم) 
  • اکشن Pop در واقع عنصر یا عناصری از آرایه تک بعدی یا چند بعدی ما رو در یک بُعد مشخص از ابتدا یا انتهای اون بُعد حذف میکنه. این اکشن شامل دو پارامتر Where و Axis هست. در صورتی که از این اکشن برای یک آرایه یک بعدی استفاده بشه تنها یک عنصر (خانه) از آرایه حذف میشه. اما اگر از این اکشن در یک آرایه دو بعدی استفاده بشه به تعداد شاخص های موجود در بُعد مجاور عناصر (خانه های) آرایه حذف میشن. به عبارت دیگه یک ردیف به طور کامل حذف میشه. اجازه بدین یک مثال بزنم.
فرض کنین یک آرایه دو بعدی شامل 16 عنصر به شکل زیر داریم:
[تصویر:  2d.png]

مطابق شکل فرض کنین قصد داریم یک عنصر از آرایه دو بعدی چهار عنصری خودمون رو از ابتدای  بُعد اول (X) حذف کنیم. با این حساب ردیف اول (شامل شاخص 0 در بعد X و شاخص های 0 و 1 و 2 و 3 در بعد Y) حذف خواهد شد. به عبارت دیگه به تعداد شاخص های  بُعد مجاور (Y) یعنی 0 و 1 و 2 و 3 که چهار عدد هستن از تعداد عناصر آرایه ما کم میشه و آرایه ما شامل 12 عنصر خواهد شد. برای اعمال چنین تنظیمی  باید پارامتر Where رو بر روی عبارت front و پارامتر Axis رو بر روی عبارت X تنظیم کنیم. بعد از اینکه این اکشن اجرا بشه آرایه من به این شکل در میاد:[تصویر:  let.png]
  • اکشن Push برای اضافه کردن عنصر یا عناصر جدید در جلو یا عقب یک بُعد مشخص در یک آرایه به کار میره. عملکرد این اکشن دقیقاً مشابه اکشن Pop هست منتها با این تفاوت که اکشن Pop برای حذف کردن و اکشن Push برای اضافه کردن عنصر یا عناصر در ابتدا یا انتهای یک بُعد مشخص از یک آرایه به کار میره. پس با این حساب اگر آرایه ما یک بعدی باشه بعد از اجرای این اکشن تنها یک عنصر و اگر آرایه ما دو بعدی باشه با اجرای این اکشن یک ردیف جدید ایجاد می شود. پس به طور دقیقتر میشه گفت که با اجرای این اکشن برای یک آرایه دو بعدی تعداد عناصر نهایی آرایه ما از فرمول زیر به دست میاد:
کد:
(تعداد شاخص های بعد اول × تعداد شاخص های بعد دوم) + (تعداد شاخص های بُعد دوم) 
پس یعنی با این حساب فرقی نمیکنه که در یک آرایه دو بعدی به تعداد عناصر بُعد اول (X) یا بُعد دوم (Y) از جلو یا عقب اضافه کنیم چرا که در هر صورت یک ردیف به تعداد عناصر آرایه اضافه خواهد شد.
این اکشن شامل سه پارامتر Where، Value و Axis هست. فرض کنین قصد دارم به یک آرایه دو بعدی 6 عنصری عناصری رو از ابتدا در بُعد اول (X) اضافه کنم که مقدارشون "love" هست. بدین منظور باید پارامتر Value رو برابر با "love"، پارامتر Where رو برابر با front و پارامتر Axis رو برابر با X قرار بدم. بعد از اجرای این اکشن تعداد عناصر آرایه من برابر خواهند بود با: 
کد:
(3×2) + (2) = 8
 
تعداد شاخص های بعد اول : 3
تعداد شاخص های بعد دوم : 2
  • اکشن Reverse توالی عناصر یک بُعد مشخص را برعکس می کند. این اکشن تنها شامل یک پارامتر Axis هست که بیانگر بُعد موردنظر جهت معکوس یا برعکس کردن است. فرض کنین یک آرایه تک بعدی به شکل زیر داریم که قصد داریم این اکشن رو روی اون پیاده سازی کنیم. آرایه تک بعدی ما شامل سه عنصره:
[تصویر:  tb.PNG]
چون آرایه من تک بُعدی هست تنها یک انتخاب دارم و میتونم بعد X رو برای پارامتر Axis در نظر بگیرم. آرایه من بعد از اجرای اکشن به این شکل تغییر میکنه:
[تصویر:  da.PNG]
  • اکشن Sort عناصر یک بُعد مشخص رو که به صورت عدد تعریف شدن رو به طور افزایشی (بر مبنای بزرگی و یا کوچکی اعداد ذخیره شده در خانه های آرایه) مرتب میکنه. این اکشن تنها شامل پارامتر Axis هست. فرض کنین من یک آرایه تک بعدی شامل سه عنصر دارم که قصد دارم روی اون این اکشن رو اعمال کنم. آرایه من قبل از اعمال این اکشن به این شکل هست:
[تصویر:  ar.PNG]

پارامتر Axis رو برای اعمال این اکشن چون آرایه ام تک بُعدی هست و انتخاب دیگه ای ندارم بر روی X قرار میدم. بعد از اجرای اکشن عناصر آرایه من به صورت افزایشی (یعنی اول شاخص 2، سپس 1 و بعد 0) مرتب خواهد شد. بعد از اجرای این اکشن آرایه من به این شکل خواهد شد:
[تصویر:  art.PNG]
همونطور که مشاهده می کنین محتوای شاخص 2 (5) در خانه اول، محتوای شاخص 1 (3) در خانه دوم و محتوای شاخص 0 (2) در خانه سوم قرار گرفت.
دقت کنین که این اکشن تنها مقادیر عددی رو به صورت افزایشی مرتب نمیکنه و قادره مقادیری که به صورت رشته هم تعریف شدن رو هم به صورت افزایشی مرتب کنه. معیار مرتب کردن رشته ها توسط این اکشن طول رشته ها هست.
دیگر اکشن های شیء آرایه :
  • * اکشن Download مقادیر ذخیره شده در درون آرایه را در قالب یک فایل جیسون (JSON) خروجی می دهد. این اکشن تنها شامل پارامتر Filename می باشد که نام فایل جیسون خروجی را مشخص می کند. پس از اجرای این اکشن فایل جیسون خروجی بلافاصله دانلود می شود.
  • * اکشن Load برای بارگیری خروجی جیسون (JSON) آرایه به کار می رود. این اکشن تنها شامل پارامتر JSON می باشد. می توان به پارامتر JSON نام فایلی که توسط اکشن Download بارگیری شده و یا یک رشته جیسون دلخواه را نسبت داد.
  • * اکشن Clear مقدار تمامی عناصر فعلی آرایه را حذف کرده و مقدار هر عنصر آرایه را به 0 تغییر می دهد.
  • * اکشن Destroy به طور کلی شیء آرایه را از پروژه حذف می کند.

اکسپرشن های کاربردی شیء آرایه :
  • * اکسپرشن At برای دریافت یک عنصر دلخواه از آرایه با وارد کردن ابعاد موردنظر به کار می رود. این اکسپرشن تنها یک پارامتر می پذیرد که همان ابعاد عنصر موردنظر می باشد. به طور مثال استفاده از این اکسپرشن به شکل زیر عنصر خانه (0,0) یک آرایه دو بعدی چهار عنصری را بر می گرداند:
کد:
Array.At(0,0)
(دقت کنید در صورتی که عنصر موردنظر وجود نداشته باشد این اکسپرشن عدد 0 را بر می گرداند.)
  • * اکسپرشن Cur شاخص مورداستفاده در Loopindex (مرحله از حلقه) لحظه ای حلقه موردنظر را در یک بُعد مشخص بر میگرداند. از این اکسپرشن می توان در یک حلقه For each به یکی از سه شکل زیر (بسته به بُعد موردنظر) استفاده کرد.
کد:
Array.CurX
یا
Array.CurY
یا
Array.CurZ
  • * اکسپرشن CurValue برای دریافت مقدار لحظه ای مورداستفاده در Loopindex (مرحله از حلقه) یک حلقه For each به کار می رود. این اکسپرشن هیچ پارامتری نمی پذیرد و به شکل زیر استفاده می شود:
کد:
Array.CurValue
در واقع این اکسپرشن نوع خلاصه شده اکسپرشن Array.At(Array.CurX, Array.CurY, Array.CurZ) می باشد.
  • * اکسپرشن IndexOf به دنبال یک مقدار ذخیره شده در بُعد اول (X) یک آرایه تک بعدی یا چند بعدی می گردد و اگر مقدار تعریف شده موجود بود شماره شاخص آن را بر می گرداند و اگر وجود نداشت عدد -1 را بر می گرداند. این اکسپرشن یک پارامتر می پذیرد که در واقع همان مقدار موردنظر جهت بررسی می باشد. مثال:
کد:
Array.IndexOf("yes")
  • * اکسپرشن AsJSON مقادیر ذخیره شده در آرایه را به صورت یک رشته جیسون برمی گرداند. این اکسپرشن هیچ پارامتری نمی پذیرد و تنها به شکل زیر به کار می رود:
کد:
Array.AsJSON
 
توضیحات کوتاه و گذرا راجع به آرایه های سه بعدی:
ما تا به اینجا راجع به آرایه های تک بعدی و دو بعدی صحبت کردیم و گفتیم چون آرایه های سه بعدی میتونن پیچیده باشن از توضیحاتش صرف نظر میکنیم. اما خالی از لطف نیست که یکسری مطالب جزئی راجع به آرایه سه بعدی ارائه بدم. یک آرایه سه بعدی همونطور که در بخش مفهوم ابعاد مشاهده کردین میتونه به شکل یک مکعب باشه. در واقع وقتی ما اطلاعات رو در یک آرایه سه بعدی ذخیره میکنیم اونا رو در حجم مکعب توزیع می کنیم. یعنی هر یک از اطلاعات ذخیره شده یک خانه مکعبی کوچک از مکعب اصلی رو اشغال میکنن. اما چطور باید ابعاد یک آرایه سه بعدی رو تعریف کنیم؟
برای تعریف ابعاد یک آرایه سه بعدی باید به شکل زیر عمل کنیم:
کد:
N × M × K
همونطور که می بینین و مشخصه یک آرایه سه بعدی شامل سه بُعد N، M و K هست. در واقع حاصلضرب سه بعد باید برابر با تعداد مقادیری باشه که قصد دارین در آرایه سه بعدی ذخیره سازی کنین چرا که اطلاعات موردنظر ما در حجم مکعب که از حاصلضرب سه یال (بُعد) مکعب به دست میاد توزیع میشه. دقت کنین که مقدار K نباید یک باشه چون در اون صورت در واقع یک آرایه دو بعدی ساختین.
برای مثال فرض کنین قصد دارم یک آرایه سه بعدی 27 عنصری تعریف کنم. پس میتونم ابعاد آرایه سه بعدی خودم رو به این شکل بیان کنم:
کد:
3 × 3 × 3
یا
9 × 1 × 3
یا
.
.
.
حالا کافیه اکشن Set Size رو انتخاب کنم و ابعاد دلخواه خودم رو تعریف کنم:
کد:
X: 9
Y: 1
Z: 3

ذخیره فایل جیسون خروجی شیء آرایه در سرور:
قبل از هر چیز لازمه شیء اِی جَکس (AJAX) رو در پروژه خودتون اضافه کنین. بعد در داخل هاستتون کدهای PHP زیر رو که نوشتم ذخیره کنین و طبق توضیحات بعدی عمل کنین.
(حتماً توجه کنین که وقتی فایل PHP رو در یک دایرکتوری یا پوشه در هاست یا سرور خودتون آپلود می کنین فایلهای جیسونی که قصد دارین ذخیره بشن هم در همون دایرکتوری ذخیره میشن.)
کد php:
<?php
/**
* @author Master Badfar
* @copyright 2020
*/
// صدور مجوز ajax برای مرورگر
header('Access-Control-Allow-Origin: *');
// قطع نمایش خطاهای مفسر PHP
ini_set('display_errors'0);
error_reporting(~E_WARNING & ~E_NOTICE & ~E_STRICT);
// تعریف متغیر میزان ارور
$error 0;
// دریافت مقادیر جیسون و نام فایل جیسون و ذخیره آنها در یک متغیر
$json_string $_POST['json'];
$filename $_POST['filename'];
// بررسی خالی نبودن دو پارامتر مقدار جیسون و نام فایل جیسون
if (empty($json_string)){
    echo "You should enter a json string." '</br>';
    $error++;
    }elseif(empty($filename)){
        echo "You should enter a name for json file." '</br>';
        $error++;
}
// نمایش تعداد کل ارورها
if ($error 0){
    echo "Number of Errors that were found: " $error;
}
// بررسی موجود بودن نام فایل قید شده؛ در صورتی که موجود نبود یک فایل جدید جیسون ساخته شود و در صورتی که موجود بود محتویات جدید جیسون در ادامه فایل گنجانده شود
if (!file_exists($filename ".json") && $error == 0){
    $openfile fopen$filename".json""w") or die("Unable to open file!");
  fwrite($openfile$json_string);
  fclose($myfile);
  echo "JSON File ' " $filename " ' successfully saved!";
  }elseif(file_exists($filename ".json")  && $error == 0){
    $openfile fopen($filename".json""w") or die("Unable to open file!");
    fwrite($openfile$json_string);
  fclose($myfile);
  echo "JSON File ' " $filename " ' successfully updated!";
}
?>
حالا برای ذخیره محتویات آرایه به صورت جیسون در سرور باید اکشن Post to URL شیء AJAX رو انتخاب کنین. پارامتر Tag رو هر چی دوست داشتین قرار بدین یا میتونین اصلاً مقداری براش لحاظ نکنین. برای پارامتر URL آدرس فایل PHP تون رو وارد کنین. مثلاً آدرس فایل PHP شما میتونه به این شکل باشه:
کد:
http://yourhost.com/file.php
  به پارامتر Method دست نزنین. پارامتر Data رو هم به طریقی که در ادامه بیان میکنم وارد کنین: 
کد:
"json=" &Array.AsJSON& "&filename=" & "test"
در واقع دو چیز به فایل PHP شما در سرور ارسال میشه. یکی نام فایل جیسون و دیگری هم محتویات فایل جیسون. همونطور که می بینین به کمک اکسپرشن AsJSON رو به روی عبارت json مقدار جیسون آرایه مون رو به سرور ارسال می کنیم. برای ارسال نام فایل جیسون موردنظرمون باید جلوی عبارت filename نام فایل رو بدون نوشتن فرمت .json درج کنیم. اینجا من نام فایل رو test انتخاب کردم. 
خروجی های کد PHP :

این کد به ما چندین خروجی با توجه به شرایط مختلف میده. 
  • * اگر هیچ مقداری برای json در نظر گرفته نشده باشد عبارت زیر نمایش داده می شود:
کد:
You should enter a json string.
  • * اگر هیچ مقداری برای filename در نظر گرفته نشده باشد عبارت زیر نمایش داده می شود:
کد:
You should enter a name for json file.
  • * اگر بعد از ارسال درخواست به فایل PHP فایل جیسونی با نام مشابه نام وارد شده در درخواست در سرور موجود باشد، محتویات فایل موجود در سرور تماماً حذف می شود و محتویات درخواست ارسال شده جایگزین محتویات قبلی می شود و به نوعی محتویات فایل جیسون آپدیت می شود. نمایش پیغام زیر حاکی از این موضوع است:
کد:
JSON File ' x ' successfully upadated!
  • * اگر بعد از ارسال درخواست به فایل PHP فایل جیسونی با نام مشابه نام وارد شده در درخواست در سرور موجود نباشد، به طبع یک فایل جیسون جدید با نام قید شده در درخواست ارسالی ایجاد می شود و محتوای جیسون موردنظر به فایل ایجاد شده در سرور اضافه می شود. پیغام زیر حاکی از این موضوع است:
کد:
JSON File ' x ' successfully saved!
  • * اگر تعداد ارورهای یافت شده (شامل خالی بودن محتوای جیسون و نام فایل جیسون) بیش از یک عدد باشد پیغام زیر پس از نمایش تمامی ارورها چاپ خواهد شد:
کد:
Number of Errors that were found: x
(عبارت x بیانگر تعداد ارورهای یافت شده است)
دریافت مقادیر ذخیره شده در یک فایل جیسون موجود در سرور و اضافه کردن محتویات فایل جیسون به آرایه :
خُب ما بررسی کردیم که چطور محتوای جیسون موردنظرمون رو در سرور ذخیره کنیم. شاید لازم باشه بخوایم محتوای یک فایل جیسون که در سرور ذخیره شده رو وارد آرایه کنیم. برای این منظور قبل از هر چیزی اگر شیء AJAX رو به پروژه مون اضافه نکردیم اضافه می کنیم. بعد کدهای PHP زیر رو در سرور خودمون ذخیره می کنیم.
(حتماً توجه کنین که این فایل PHP رو باید داخل دایرکتوری یا پوشه ای از هاست یا سرورتون قرار بدین که فایل های جیسون در اون وجود داره.)
کد php:
<?php
/**
* @author Master Badfar
* @copyright 2020
*/
// صدور مجوز ajax برای مرورگر
header('Access-Control-Allow-Origin: *');
// قطع نمایش خطاهای مفسر PHP
ini_set('display_errors'0);
error_reporting(~E_WARNING & ~E_NOTICE & ~E_STRICT);
// تعریف متغیر میزان ارور
$error 0;
// دریافت نام فایل جیسون موردنظر و ذخیره آن در یک متغیر
$filename $_POST['filename'];
// بررسی خالی نبودن پارامتر filename
    if(empty($filename)){
        echo "You should enter the name of the json file." '</br>';
        $error++;
// بررسی وجود داشتن فایل وارد شده
   }elseif(!file_exists($filename ".json")){
    echo "The file does not exist." '</br>';
    $error++;
    }
        // نمایش تعداد کل ارورها
             if($error 0){
                echo "Number of Errors that were found: " $error;
}
// خواندن فایل جیسون موردنظر
if ($error == 0){
// باز کردن فایل جهت خواندن
$LoadFile fopen($filename ".json""r") or die(" File not found");
// تشکیل حلقه while جهت خواندن خط به خط فایل
while(!feof($LoadFile)){
    echo fgets($LoadFile);
}
// پایان حلقه
//
// بستن فایل باز شده
fclose($LoadFile);
}
?>
حالا کافیه اکشن Post to URL شی AJAX رو انتخاب کنیم. پارامتر Tag رو هر چی دوست داشتین قرار بدین یا اصلاً بهش مقداری ندین. برای پارامتر URL آدرس فایل PHP تون رو وارد کنین. مثلاً آدرس فایل PHP شما میتونه به این شکل باشه:
کد:
http://yourhost.com/file.php
  به پارامتر Method دست نزنین. پارامتر Data رو هم به طریقی که در ادامه بیان میکنم وارد کنین: 
کد:
[color=#666666]"filename="&"test"[/color]
(دقت کنین نام فایل جیسون موردنظر رو حتماً بدون درج فرمت .json وارد کنید.)
خُب پروسه بسیار ساده است. ما یک درخواست به فایل PHP ارسال می کنیم و اگر فایل موجود بود و مشکلی وجود نداشت PHP محتویات فایل رو به ما برمیگردونه یا برای ما نمایش میده. حالا چطور باید این محتویات جیسون رو وارد آرایه بکنیم؟ کافیه از اکشن Load استفاده کنین و مقدار پارامتر JSON این اکشن رو برابر با AJAX.Lastdata قرار بدین. تبریک میگم! به راحتی تونستین محتویات فایل جیسون رو وارد آرایه کنین. حالا میتونین روی عناصر دلخواه خودتون پردازش داشته باشین.
خروجی های کد PHP :

این کد به ما چندین خروجی با توجه به شرایط مختلف میده. 
  • * اگر هیچ مقداری برای filename در نظر گرفته نشده باشد عبارت زیر نمایش داده می شود:
کد:
You should enter the name of the json file.
  • اگر فایل موردنظر در سرور موجود نبود پیغام زیر نمایش داده می شود:
کد:
The file does not exist.
  • * اگر تعداد ارورهای یافت شده (شامل خالی بودن نام فایل جیسون و موجود نبودن فایل موردنظر در سرور) بیش از یک عدد باشد پیغام زیر پس از نمایش تمامی ارورها چاپ خواهد شد:
کد:
Number of Errors that were found: x
(عبارت x بیانگر تعداد ارورهای یافت شده است)
​​​​​​
امیدوارم این مطلب براتون کاربردی و مفید واقع شده باشه.
همونطور که دیدین آرایه دقیقاً اقتباسی از ماتریس در ریاضیات هست.
برای نوشتن این مطلب زمان زیادی صرف شده پس لطفاً با نظرات خوب و سپاس هاتون حقیر رو برای نوشتن این شکل آموزش ها بیش از پیش ترغیب کنین.
اگر هم موردی جا افتاده یا احساس میکنین درست بیان نشده حتماً در ادامه گوشزد کنین.
آموزش شیء دیکشنری رو هم میتونین در اینجا مطالعه کنین.
با آرزوی بهترین ها...
غایب
  پاسخ


 سپاس شده توسط: persiangamer ، M.gh ، amin hosseini ، shazde ، mhp ، oak ، kakmamad ، ghasem ، محمد 82 ، Sambig ، seyed
#2
آقا دمت گرم بالاخره فهمیدم آرایه چیه و اکشن هاش رو هم فهمیدم دستت طلا  41
  پاسخ


 سپاس شده توسط: Master Badfar ، shazde ، oak
#3
آقا دمت گرم.
من وقت نمیکردم همچین آموزش پر و پیمونی بنویسم. خیلی از بچه ها هم تو آرایه مشکل داشتن.
انشاالله از این به بعد بازیهای باحالتری از بچه ها ببینیم.
دستت درد نکنه.
  پاسخ


 سپاس شده توسط: M.gh ، Master Badfar ، shazde ، oak
#4
واقعا ممنون بابت اموزش فقط چنتا سوال :
1 - در اکشن Reverse تصویر دومت اشتباه نیست ؟ نباید تصویر دوم برعکس تصویر اول باشه (مقدار شاخص 2 تو 0 ، مقدار شاخص 0 تو 2 و 1 هم تو1) ؟؟؟
2 - تو اکشن sort افزایشی میره یا کاهشی ؟ وقتی میگید 2و1و0 . درواقع عدد شاخص ها رو از بزرگ به کوچیک (نموارد کاهشی اعداد شاخص ها) تنظیم میکنه . اینطوریه یا من متوجه نشدم ؟
3 - اون اکسپرشن index of و at چه فرقی دارن ؟ index of که فقط واسه یک بعدیه اما با at نمیشه مقدار یک شاخص در ارایه تک بعدی رو دریافت کرد؟ (به این صورت : arrat.at(1))
استودیو بازیسازی ایروید
جدید ترین ها : شهرزاد ، دربند;1357 و ATOM
[تصویر:  ads.gif]
  پاسخ


 سپاس شده توسط: Master Badfar
#5
(1399/1/24، 01:29 عصر)محمد 82 نوشته است: واقعا ممنون بابت اموزش فقط چنتا سوال :
1 - در اکشن Reverse تصویر دومت اشتباه نیست ؟ نباید تصویر دوم برعکس تصویر اول باشه (مقدار شاخص 2 تو 0 ، مقدار شاخص 0 تو 2 و 1 هم تو1) ؟؟؟
2 - تو اکشن sort افزایشی میره یا کاهشی ؟ وقتی میگید 2و1و0 . درواقع عدد شاخص ها رو از بزرگ به کوچیک (نموارد کاهشی اعداد شاخص ها) تنظیم میکنه . اینطوریه یا من متوجه نشدم ؟
3 - اون اکسپرشن index of و at چه فرقی دارن ؟ index of که فقط واسه یک بعدیه اما با at نمیشه مقدار یک شاخص در ارایه تک بعدی رو دریافت کرد؟ (به این صورت : arrat.at(1))
از دقتت ممنونم چرا که همه مواردی که گفتی بر میگرده به اشتباهاتی که بنده داشتم.
متن اصلاح شد و ظاهراً الان مشکلی نداره.
قسمتهایی رو که متوجه نشدی رو دوباره مطالعه کن تا ابهامت برطرف بشه.
در ضمن بابت اشتباهاتی که در متن بود از شما و دیگر دوستان هم عذرخواهی میکنم.
غایب
  پاسخ


 سپاس شده توسط: محمد 82
#6
(1399/1/24، 01:29 عصر)محمد 82 نوشته است: واقعا ممنون بابت اموزش فقط چنتا سوال :
1 - در اکشن Reverse تصویر دومت اشتباه نیست ؟ نباید تصویر دوم برعکس تصویر اول باشه (مقدار شاخص 2 تو 0 ، مقدار شاخص 0 تو 2 و 1 هم تو1) ؟؟؟
2 - تو اکشن sort افزایشی میره یا کاهشی ؟ وقتی میگید 2و1و0 . درواقع عدد شاخص ها رو از بزرگ به کوچیک (نموارد کاهشی اعداد شاخص ها) تنظیم میکنه . اینطوریه یا من متوجه نشدم ؟
3 - اون اکسپرشن index of و at چه فرقی دارن ؟ index of که فقط واسه یک بعدیه اما با at نمیشه مقدار یک شاخص در ارایه تک بعدی رو دریافت کرد؟ (به این صورت : arrat.at(1))
محمد جان الان متوجه شدی آرایه چی هست؟
مواردی که توش ابهام داشتی رفع شد؟
غایب
  پاسخ


 سپاس شده توسط: محمد 82
#7
عالی دمت گرم . چیز ساده ایه اما اگه توضیحش نبود واقعا سخت بود.
فقط نمیشه یک عنصر رو صفر کرد ؟ مثلا من گفتم یکی از عناصر ارایه تک بعدی هر ثانیه تعداد اسپرایت رو نشون بده . وقتی اسپرایت 2و1و3و6و7و... هست درست نشون میده و وقتی میرسه به 1 (یعنی هنوز یدونه تو صفحه هست) و وقتی destroy میشه اسپرایت ، همچنان 1 میمونه . درصورتی که باید 0 بشه . چرا اینطوریه ؟

واقعا چیز کمک کننده و درجه 1 هست . من امروز با همین مشکلی که چندین روز داشتم و نمیدونستم چطوری حلش کنم رو حل کردم .
استودیو بازیسازی ایروید
جدید ترین ها : شهرزاد ، دربند;1357 و ATOM
[تصویر:  ads.gif]
  پاسخ


 سپاس شده توسط: Master Badfar
#8
(1399/1/24، 06:23 عصر)محمد 82 نوشته است: عالی دمت گرم . چیز ساده ایه اما اگه توضیحش نبود واقعا سخت بود.
فقط نمیشه یک عنصر رو صفر کرد ؟ مثلا من گفتم یکی از عناصر ارایه تک بعدی هر ثانیه تعداد اسپرایت رو نشون بده . وقتی اسپرایت 2و1و3و6و7و... هست درست نشون میده و وقتی میرسه به 1 (یعنی هنوز یدونه تو صفحه هست) و وقتی destroy میشه اسپرایت ، همچنان 1 میمونه . درصورتی که باید 0 بشه . چرا اینطوریه ؟
واقعا چیز کمک کننده و درجه 1 هست . من امروز با همین مشکلی که چندین روز داشتم و نمیدونستم چطوری حلش کنم رو حل کردم .
خوشحالم که موفق شدی آرایه رو به کار ببندی. در کنار آرایه میتونی از دیکشنری هم در پروژه ات استفاده کنی که توضیحاتش رو در یک تاپیک مجزا قرار دادم.
میتونی آرایه رو Destory کنی.
وقتی میخوای Destroy کنی یک آرایه رو بین Destroy کردن آرایه و مثلاً نمایش یک عنصر آرایه در یک تسکت برای مطمئن شدن از صفر شدن مقادیر بهتره با کمک اکشن Wait یک مقدار تأخیر لحاظ کنی. حتی 0.1 ثانیه تأخیر هم کافیه.

یک تصویر از ایونت هات اگر ارسال کنی بهتر میتونم راهنمایی ات کنم.
اینطوری اظهارنظر خاصی نمیشه کرد.
غایب
  پاسخ


 سپاس شده توسط:
#9
خب مقدار صفر نمیشه که destroy کنم . الان میخوام ببینم مشکل از ارایه است که صفر نمیشه (چون سایز ارایه نمیتونه صفر باشه ، البته فک نکنم ربطی به این داشته باشه ، این سایز نیست یه عنصره) یا مشکل از یه جای کار منه ؟

اونتا هم خیلی بهم ریخته است ، و مهمم نیست چون دارم تمرین میکنم فایل خاصی نیست که بخوام منتشر کنم . نشدم نشد
استودیو بازیسازی ایروید
جدید ترین ها : شهرزاد ، دربند;1357 و ATOM
[تصویر:  ads.gif]
  پاسخ


 سپاس شده توسط:
#10
(1399/1/24، 06:46 عصر)محمد 82 نوشته است: خب مقدار صفر نمیشه که destroy کنم . الان میخوام ببینم مشکل از ارایه است که صفر نمیشه (چون سایز ارایه نمیتونه صفر باشه ، البته فک نکنم ربطی به این داشته باشه ، این سایز نیست یه عنصره) یا مشکل از یه جای کار منه ؟
خُب یعنی تعداد اسپرایت های لایوت که متغیر هست در عناصر یا یک عنصر یک آرایه ذخیره میشن دیگه؟
مطمئنی بعد از Destroy کردن همه اسپرایت ها مقدار عنصر یا عناصر آرایه رو دریافت میکنی؟
 
غایب
  پاسخ


 سپاس شده توسط:


موضوع‌های مشابه…
موضوع نویسنده پاسخ بازدید آخرین ارسال
  آموزش پروژه محور ساخت بازی مار و پله mohsen_nasri 6 3,807 1403/10/24، 09:38 عصر
آخرین ارسال: Tggi
Star مهم آموزش خروجی اندروید روی سیستم شخصی rezamms 128 86,462 1403/10/23، 04:58 عصر
آخرین ارسال: Tggi
  مهم آموزش تصویری خروجی مستقیم - یکبار برای همیشه! rezamms 33 20,911 1401/2/13، 09:39 عصر
آخرین ارسال: kamran_cn
  خروجی اندرید davinmstr1 2 2,601 1400/8/4، 10:23 عصر
آخرین ارسال: ᔕinaᗪehghani
  AAB (بسته برنامه اندروید) چيست؟ + نحوه خروجي گرفتن در كرودوا ᔕinaᗪehghani 15 8,600 1400/6/21، 01:55 صبح
آخرین ارسال: mehdi1100

پرش به انجمن: