پنجشنبه ۰۴ اردیبهشت ۱۴۰۴

Thursday, April 24, 2025 GMT +3:30

توابع کار با آرایه در PHP - بخش اول

php-array-functions

مبحث آرایه ها که در آموزش پیشین با آن آشنا شدیم، یکی از پرکاربردترین و در عین حال پیچیده ترین مباحث در بیشتر زبان های برنامه نویسی و به طور خاص php است، گستره استفاده از آرایه (Array) در php به حدی است که کم تر برنامه کاربردی را می توان یافت که در قسمتی از کدهای خود متکی بر آن نباشد، قابلیت تفکیک پذیری، تجزیه و ترکیب، تغییر چینش، دسته بندی آسان و طبقه بندی شده، دسترسی سریع و... باعث می شود که استفاده از آرایه ها در اغلب مواقع اجتناب ناپذیر به نظر برسد، به این خاطر است که در مفسر php برای مدیریت آرایه ها توابع از پیش تعریف شده زیادی در نظر گرفته شده است که هر کدام هدف و دستورالعمل خاصی دارند، از این رو اگر می خواهیم کار با آرایه ها را بیاموزیم، ناگزیر باید این توابع و نحوه کار آنها را نیز بشناسیم، البته فراوانی این توابع به حدی است که در یک مطلب نمی توان تمام آنها را خلاصه کرد، لذا در قالب چند مطلب آتی، در حد امکان به موارد عمومی می پردازیم و توابع خاص و پیچیده تر را نیز در مباحثی جداگانه مورد بررسی قرار خواهیم داد.

تابع is_array


نخستین تابعی که به آن می پردازیم، is_array نام دارد، is_array یک متغیر را به عنوان آرگومان دریافت کرده و بررسی می کند تا ببیند که آیا متغیر مورد نظر یک آرایه است (مقدار true یا 1 برگردانده می شود) یا خیر (مقدار false یا صفر برگردانده می شود)؛ به مثال زیر توجه کنید.
<?php
$array = array('welcome', 'to', 'php', 'array', 'learning');
$check = is_array($array);
if($check == true){
    echo 'true';
}
else{
    echo 'false';
}
?>
خروجی مثال بالا برابر خواهد بود با true، چرا که متغیر فرضی array یک آرایه است و نتیجه بررسی تابع is_array برابر عدد 1 که معادل true در php است خواهد بود.
نکته: با استفاده از دستور print_r می توانید محتویات درون یک آرایه را به صورت قابل خواندن مشاهده کنید، به طور مثال برای آرایه بالا، به صورت زیر می توانیم این کار را انجام دهیم.
<?php
$array = array('welcome', 'to', 'php', 'array', 'learning');
print_r($array);
?>
که خروجی برابر خواهد بود با مقادیر زیر.
Array
(
    [0] => welcome
    [1] => to
    [2] => php
    [3] => array
    [4] => learning
)

تابع explode


اگر بخواهیم یک رشته متنی را تبدیل به آرایه کنیم، تابع explode در php این کار را انجام می دهد، نحوه کار این تابع بسیار ساده است، یک مقدار به عنوان جدا ساز (کلید تجزیه) و یک متغیر (رشته متنی) به عنوان آرگومان دریافت کرده و در نهایت یک آرایه به ما تحویل می دهد، به طور مثال اگر متنی که می خواهیم آن را تجزیه و تبدیل به آرایه کنیم، به صورت زیر باشد:
welcome to php array learning
کلید تجزیه در اینجا فواصل خالی بین کلمات است، لذا خواهیم نوشت:
<?php
$string = 'welcome to php array learning';
$convert = explode(' ', $string);
print_r($convert);
?>
اگر اکنون از متغیر convert با استفاده از print_r خروجی بگیریم، خواهیم دید که این متغیر تبدیل به یک آرایه شده است.
Array
(
    [0] => welcome
    [1] => to
    [2] => php
    [3] => array
    [4] => learning
)
نکته: تابع explode یک عدد نیز به عنوان آرگومان سوم می پذیرد، این عدد تعداد کلیدهای تجزیه ای که در تبدیل به آرایه استفاده می شوند را مشخص می کند، به طور مثال اگر بخواهیم رشته ما در 3 آرایه تجزیه شود، دستور را به شکل زیر تغییر می دهیم:
<?php
$string = 'welcome to php array learning';
$convert = explode(' ', $string, 3);
print_r($convert);
?>
و خروجی برابر خواهد بود با مقادیر زیر.
Array
(
    [0] => welcome
    [1] => to
    [2] => php array learning
)
نکته: دستور print_r تنها در مورد آرایه ها کاربرد دارد.

تابع implode


در کنار تابع explode تابع دیگری به نام implode وجود دارد که دقیقا کار آن برعکس explode است، implode مقادیر موجود در کلیدهای آرایه را به وسیله یک کلید ترکیب، تبدیل به یک رشته می کند، به مثال زیر توجه کنید.
<?php
$array = array('welcome', 'to', 'php', 'array', 'learning');
$convert = implode(' ', $array);
echo $convert;
?>
ملاحظه می کنید که در اینجا ما از یک فضای خالی به عنوان کلید ترکیب استفاده کرده ایم، نتیجه مثال بالا به صورت زیر خواهد بود.
welcome to php array learning
که در واقع آرایه ما تبدیل به یک رشته متنی شده است.

تابع  array_change_key_case


اگر آرایه ما به جای اعداد دارای کلیدهای متنی باشد و بخواهیم حروف کوچک کلیدها را تبدیل به حروف بزرگ یا برعکس حروف بزرگ کلیدها را به حروف کوچک تبدیل کنیم، از تابع  array_change_key_case استفاده می کنیم، البته این تابع بیشتر برای مقادیر به زبان انگلیسی کاربرد دارد.
تابع array_change_key_case دو آرگومان می پذیرد، آرگومان اول همان آرایه ای  است که قصد بررسی آن را داریم (input)، آرگومان دوم می تواند دو مقدار CASE_UPPER (تبدیل به حروف بزرگ) یا  CASE_LOWER (تبدیل به حروف کوچک، حالت پیش فرض) باشد (case)، به عنوان مثال آرایه زیر را در نظر بگیرید.
<?php
$array = array('ali' => 3, 'pedram' => 6, 'maryam' => 5);
$change = array_change_key_case($array, CASE_UPPER);
print_r($change);
?>
خروجی مثال بالا به شکل زیر خواهد بود.
Array
(
    [ALI] => 3
    [PEDRAM] => 6
    [MARYAM] => 5
)

تابع array_chunk


اگر بخواهیم یک آرایه را به چند آرایه تجزیه کنیم، تابع array_chunk می تواند به کار گرفته شود، این تابع سه آرگومان می پذیرد، آرگومان اول همان آرایه ای است که روی آن کار می کنیم (input)، آرگومان دوم تعداد کلید و مقدار برای آرایه های زیر مجموعه است (size) و آرگومان سوم نحوه افزایش شماره کلیدها را (به صورت true یا false) در آرایه های زیر مجموعه نشان می دهد (حالت پیش فرض false است)که به آن preserve_keys گفته می شود، به مثال زیر توجه کنید.
<?php
$array = array('a', 'b', 'c', 'd' , 'e');
$chunk = array_chunk($array, 2, false);
print_r($chunk);
?>
خروجی مثال بالا به صورت زیر خواهد بود.
Array
(
    [0] => Array
        (
            [0] => a
            [1] => b
        )

    [1] => Array
        (
            [0] => c
            [1] => d
        )

    [2] => Array
        (
            [0] => e
        )

)
ملاحظه می کنید که آرایه های زیرمجموعه با دو کلید و مقدار تفکیک شده اند، البته چون تعداد کلید های ما پنج عدد بود، آرایه زیرمجموعه سوم تنها یک کلید و مقدار دارد.
اگر مقادیر preserve_keys برابر true باشد، خروجی مثال ما به صورت زیر خواهد بود.
Array
(
    [0] => Array
        (
            [0] => a
            [1] => b
        )

    [1] => Array
        (
            [2] => c
            [3] => d
        )

    [2] => Array
        (
            [4] => e
        )

)

تابع array_combine


تابع array_combine برای ترکیب دو آرایه و ایجاد یک آرایه جدید کاربرد دارد، عملکرد این تابع به این شکل است که مقادیر آرایه اول را (آرگومان اول) به عنوان کلید و مقادیر آرایه دوم (آرگومان دوم) را به عنوان مقدار آرایه نهایی در نظر می گیرد، یعنی تنها با استفاده از مقادیر (value) دو آرایه را به یک آرایه تبدیل می کند، به مثال زیر توجه کنید.
<?php
$array1 = array('a', 'b', 'c', 'd' , 'e');
$array2 = array('55', '23', '43', '12' , '98');
$combine = array_combine($array1, $array2);
print_r($combine);
?>
خروجی مثال بالا به شکل زیر خواهد بود.
Array
(
    [a] => 55
    [b] => 23
    [c] => 43
    [d] => 12
    [e] => 98
)
یادآوری: دقت کنید که کلید ها در آرایه های بالا در واقع به صورت عددی و پنهان هستند، یعنی به فرض آرایه اول در واقع به شکل زیر است.
$array1 = array(0 => 'a', 1 => 'b', 2 => 'c', 3 => 'd' , 4 => 'e');

تابع array_count_values


تابع array_count_values تعداد فراوانی تکرار هر مقدار (value) از یک آرایه را محاسبه کرده و با استفاده از آن مقدار، یک آرایه جدید می سازد، ساختار آرایه جدید به این صورت است که مقادیر به عنوان کلید های آرایه جدید و تعداد دفعات تکرار آنها به عنوان مقادیر آرایه جدید به کار می روند، به مثال زیر توجه کنید.
<?php
$array = array('a', 'b', 'a', 'd' , 'b');
$count_value = array_count_values($array);
print_r($count_value);
?>
خروجی مثال بالا به شکل زیر خواهد بود.
Array
(
    [a] => 2
    [b] => 2
    [d] => 1
)

تابع array_diff_assoc


تابع array_diff_assoc برای مقایسه یک آرایه با یک یا چند آرایه دیگر کاربرد دارد، نتیجه و خروجی این تابع، یک آرایه جدید با مقادیری است که در آرایه اصلی وجود داشته، ولی در آرایه یا آرایه های مقایسه شده وجود نداشته است، به مثال زیر توجه کنید.
<?php
$array1 = array('Tehran', 'Fars', 'Markazi', 'Gilan' , 'Esfahan');
$array2 = array('Tehran', 'Qazvin', 'Markazi', 'Gilan' , 'Khouzestan');
$array_diff = array_diff_assoc($array1, $array2);
print_r($array_diff);
?>
خروجی مثال بالا به صورت زیر خواهد بود.
Array
(
    [1] => Fars
    [4] => Esfahan
)
نکته: ترتیب کلیدها و مقادیر بین آرایه هایی که مقایسه می شوند در این تابع اهمیت دارد، یعنی به فرض اگر مقدار Tehran در آرایه اول با کلید صفر مشخص شود، در آرایه دوم هم باید در کلید صفر وجود داشته باشد، در غیر این صورت تابع array_diff_assoc آن را نیز به عنوان یک تفاوت بین آرایه ها به خروجی ارسال می کند.

تابع array_diff_key


تابع array_diff_key مشابه تابع array_diff_assoc عمل می کند، با این تفاوت که در اینجا به جای مقادیر، اگر کلید ها بین دو یا چند آرایه مقایسه شده متفاوت باشند، مقادیر متفاوت آرایه اول به خروجی ارسال می شوند، به مثال زیر توجه کنید.
<?php
$array1 = array('Tehran' => 12, 'Fars' => 45, 'Markazi' => 33, 'Gilan' => 47 , 'Esfahan' => 51);
$array2 = array('Tehran' => 16, 'Qazvin' => 32, 'Markazi' => 39, 'Gilan' => 48, 'Khouzestan' => 51);
$array_diff = array_diff_key($array1, $array2);
print_r($array_diff);
?>
خروجی مثال بالا به صورت زیر خواهد بود.
Array
(
    [Fars] => 45
    [Esfahan] => 51
)
ملاحظه می کنید با اینکه مقادیر در آرایه ها با هم متفاوت هستند، اما تنها مواردی به خروجی ارسال شده اند که کلیدهایشان متفاوت بوده.

تابع array_diff_uassoc


تابع array_diff_uassoc نیز با هدف مقایسه دو یا چند آرایه و به دست آوردن خروجی از مقادیر متفاوت آنها به صورت یک آرایه جدید مورد استفاده قرار می گیرد، تنها تفاوت در اینجا این است که خود تابع از یک تابع دیگر که توسط کاربر تعریف می شود، به عنوان آرگومان سوم استفاده می کند، این تابع (تابع کاربر) باید طوری نوشته شود که یکی از اعداد 1-، صفر یا 1 را برگرداند، به مثال زیر توجه کنید.
<?php
function value_compare($a, $b){
    if ($a === $b){
        return 0;
    }
    return ($a > $b)? 1:-1;
}
$array1 = array("lang" => "fa", "page" => "index", "date" => "2012", "10", "03", "10:40");
$array2 = array("lang" => "fa", "page" => "index", "date" => "2013", "16", "03");
$result = array_diff_uassoc($array1, $array2, "value_compare");
print_r($result);
?>
خروجی مثال بالا به شکل زیر خواهد بود.
Array
(
    [date] => 2012
    [0] => 10
    [2] => 10:40
)
ملاحظه می کنید که آرایه خروجی ما، از عناصری که در آرایه اول وجود دارد ولی در آرایه دوم وجود ندارد تشکیل شده است، کلید ها نیز از آرایه اول استخراج شده اند.
نکته 1: در تابعی که توسط کاربر تعریف می شود (در اینجا تابع value_compare، برای هر کلید و مقدار آرایه ها مقایسه ای صورت می گیرد، اگر دو مقدار مساوی باشند، عدد صفر برگردانده می شود و این یعنی آن مورد نباید در خروجی باشد، در غیر این صورت عدد 1 یا 1- برگردانده می شود و مقادیر مربوطه به خروجی ارسال می شود.
نکته 2: در قسمت دوم تابع value_compare از شیوه مختصر نویسی دستورات شرطی (if و else) در php استفاده شده است، در اینجا علامت ? بعد از پرانتز مقایسه، نقش if و علامت : نقش else را دارد.

تابع array_diff_ukey


تابع array_diff_ukey نیز کارکردی مشابه array_diff_uassoc دارد، با این تفاوت که در اینجا به جای مقادیر، از کلیدها برای بررسی دو یا چند آرایه استفاده می شود، در اینجا نیز از یک تابع جانبی که توسط کاربر تعریف می شود استفاده شده و خروجی آن بر مبنای اعداد صفر، 1- یا 1 برگردانده می شود، به مثال زیر توجه کنید.
<?php
function key_compare($a, $b){
    if ($a === $b){
        return 0;
    }
    return ($a > $b)? 1:-1;
}
$array1 = array("lang" => "fa", "page" => "index", "date" => "2012", "10", "03", "10:40");
$array2 = array("lang" => "fa", "page" => "index", "date" => "2013", "16", "03");
$result = array_diff_ukey($array1, $array2, "key_compare");
print_r($result);
?>
خروجی مثال بالا به شکل زیر خواهد بود.
Array
(
    [2] => 10:40
)
اتفاقی که در کد بالا می افتد این است که چون مقدار فرضی 10:40 دارای کلید 2 است و چنین کلیدی در آرایه دوم وجود ندارد، به عنوان خروجی برگردانده می شود، در واقع اگر از آرایه ها به صورت مستقل با دستور print_r خروجی بگیرید، به طور ملموس تری با نحوه کارکرد این تابع آشنا خواهید شد.

تابع array_diff


تابع array_diff نیز از خانواده توابع مقایسه ای در مورد آرایه ها است، این تابع مواردی را به عنوان خروجی انتخاب می کند که مقادیر دو کلید همسان، متفاوت باشند، یا مقادیر همسان و کلیدها متفاوت باشند و اگر یک کلید در آرایه اول وجود داشته باشد ولی آن کلید در آرایه دوم وجود نداشته باشد نیز به عنوان خروجی برگردانده می شود، به مثال زیر توجه کنید.
<?php
$array1 = array(0 => "a", 1 => "b", 2 => "c", 3 => "b");
$array2 = array(0 => "a", 1 => "b", 2 => "f");
$result = array_diff($array1, $array2);
print_r($result);
?>
خروجی مثال بالا به صورت زیر خواهد بود.
Array
(
    [2] => c
)
نکته: همان طور که ملاحظه می کنید، این تابع مقادیر تکراری را مجددا بررسی نمی کند، لذا چون مقدار b در کلید 1 بررسی شده و تفاوتی وجود نداشته است، در کلید 3 از آرایه اول مجددا بررسی نمی شود، اما اگر مقادیر b در کلید 1 از آرایه اول با مقادیر کلید 1 از آرایه دوم متفاوت بود، هم کلید 1 و هم کلید 3 آرایه اول به خروجی ارسال می شد.
بحث توابع مربوط به آرایه ها را در آموزش های بعدی ادامه خواهیم داد.
دسته بندی: آموزش مقدماتی » PHP
related مطالب بیشتر:
عملگرها (Operators) در PHP
تعریف و استفاده از متغیر (Variable) در PHP
دستورات شرطی (Conditional Statements) در PHP
آرایه (Array) در برنامه نویسی PHP
آموزش برنامه نویسی وب با PHP
دیدگاه
more ۲۸ دیدگاه برای این مطلب ارسال شده است.
more چینش دیدگاه ها به ترتیب از جدیدترین به قدیمی ترین است.
برنامه نویس
۱۸:۱۵ ۱۴۰۰/۰۲/۰۱
سلام. Obfuscation فایل php مورد خوبی سراغ دارین که قابل تبدیل به سورس اصلی نباشه یا اینقدر برای کاربر سخت باشه که بی خیال قضیه بشه؟
تا آنجا که اطلاع داریم برنامه ای به نام TrueBug PHP Obfuscator کاربردی بود اما اگر سورس ها کوچک هستند می توانید دستی این کار را با Replace in Path برنامه هایی مانند PHPStorm هم انجام دهید، البته باید خیلی دقت کنید که کدها با خطا مواجه نشوند.
برنامه نویس
۱۶:۵۴ ۱۴۰۰/۰۲/۰۱
سلام.
ممنونم برای اطلاعات خوبتون. لطف کردین.
برنامه نویس
۱۲:۴۲ ۱۴۰۰/۰۲/۰۱
سلام. ممنون برای پاسخ عالی شما. در مورد اتصال ریموت SQL کامل متوجه شدم. ادامه آدرس باید 3306 نوشته بشه؟
برای آپلود فایل ها ، من می خوام هم فایل جدید آپلود کنم ، هم فایل جایگزین کنم و هم فایل ها رو حذف کنم. با FTP میشه هر سه کار رو انجام داد؟ چون من تا حالا با FTP فقط فایل ها رو آپلود کردم و کاری به فایل های قدیمی نداشتم.
متد FTP مناسب تره و سرعت و کیفیت بهتری داره یا متد curl
یه سوال دیگه ؛ ببخشید سوالاتم خیلی زیاد شد.
توضیح دامنه: فرض کنیم دامنه هاست من که محل نگهداری فایل های PHP هست برابر php.com باشه و دامنه هاست سفارش دهنده برابر site.com باشه. فایل های php در php.com هستن و دیتابیس و فایل های دیگه کلا توی site.com هستن. حالا چون فایل های PHP در هاست php.com هستن پس تمام آدرس ها بر اون اساس ذکر شده مثل php.com/panel یا php.com/login و .... حالا چیکار کنم که کاری کنم فرضا با آدرس site.com/login به صورت خودکار php.com/login بالا بیاد و اجرا بشه. و یا اینکه از همون اون میشه به جای آدرس php.com/panel آدرس site.com/panel نوشت؟
آیا کلا به جای انجام کارهای بالا ، میشه به جاش همه چی در site.com باشه و فایل های php مهم در php.com باشه.
از include در php استفاده کنیم و آدرس فایل php مهم در php.com رو بدیم و به گونه ای باشه که با وارد کردن آدرس php.com/important.php فایل های php قابل خواندن توسط فرد نباشه. و فقط توسط هاست خوانده بشن؟
بازم معذرت می خوام ببخشید. وقتتون رو میگیرم.
پاسخ قبلی ویرایش و اطلاعاتی اضافه شد، لطفا از آخرین اطلاعات استفاده کنید، در مورد FTP یا curl قاعدتا FTP از نظر سایر قابلیت ها کاملتر است فقط ممکن است سرعت کار کمی پائین تر باشد، در curl باید قسمتی از برنامه که وظیفه دریافت فایل ارسالی یا حذف آن را دارد در سرور مورد نظر وجود داشته باشد اما با FTP این کار با کدهای سرور اصلی انجام می شود، منتها کار با FTP و نوشتن متدهای مناسب در آن کمی پیچیده تر است و باید مسلط باشید.
https://www.php.net/manual/en/ref.ftp.php
در مورد دامنه ها واقعیت این است که نمی توانیم از همه کدها محافظت کنیم طوری که در سرور مورد نظر نباشند، الزما باید بخشی از کار در این سرور کدنویسی شود اما اگر نیاز بود می توانید از تکنیک هایی مانند مبهم سازی کدها (Obfuscation) استفاده کنید، به هر صورت وقتی کنترل دو سرور در اختیار شما باشد کار ساده تر می شود و می توانیم از توابعی مانند file_get_contents در سرور مورد نظر استفاده و محتوای سرور اصلی را نمایش دهیم، البته سعی کنید طوری نباشد که هر کسی بتواند سایت شما را در فریم نمایش دهد، به فرض کد امنیتی به صورت متد GET به انتهای آدرس URL اضافه کنید و در سرور اصلی ابتدا کد را چک کنید، اگر صحیح بود نتیجه را چاپ کنید، در کل ابتدا باید تمام ابزارها و محدودیت ها را خوب بشناسید و سپس ترکیبی از روش ها را انتخاب کنید، امکان Include فایل ها به این شیوه با فعال سازی allow_url_fopen و allow_url_include در فایل php.ini ممکن است اما به لحاظ امنیت ریسک بالایی دارد و توصیه نمی شود.
برنامه نویس
۲۳:۱۰ ۱۴۰۰/۰۱/۳۱
سلام و ممنون به خاطر سایت خوبتون. یه سوال خدمتتون داشتم. من یه پروژه برنامه نویسی گرفتم و دوست ندارم فایل های php در اختیار سفارش دهنده قرار بگیره و در مورد این باهاش قرارداد بستم.
آیا راهی وجود داره که دیتابیس و قسمت آپلود فایل در هاست سفارش دهنده باشه و فایل های php در هاست من اجرا بشن؟ می دونم که با ftp میشه قضیه فایل ها رو حل کرد. ایا با ریموت sql میشه قضیه دیتابیس رو حل کرد؟
بعد برای اتصال دامنه باید چیکار کنم؟
ممنون میشم بهم جواب بدین.
بله برای اتصال به MySQL از سرور دیگر Remote MySQL راه حل مناسبی است به شرط اینکه به تنظیمات اصلی سرور دسترسی داشته باشیم و بتوانیم این امکان را فعال کنیم (به خاطر مسائل امنیتی به صورت پیش فرض معمولا غیرفعال است)، بعد از فعالسازی در تنظیمات اصلی سرور اگر از cPanel استفاده می کنید تنظیمات کاربری این امکان در قسمت Databases در دسترس است، آدرس دامنه (یا ترجیحا IP) سایتی که کدهای PHP را اجرا می کند در این قسمت اضافه کنید، در کدهای PHP باید به شکل نمونه زیر به سرور دیتابیس متصل شویم یعنی پورت اتصال تعریف شده باشد:
mysqli_connect("example.com", "username", "password", "dbname", 3306);
دقت کنید که User اتصال تمام مجوزها را داشته باشد، یک راه حل دیگر این است که اطلاعات در سرور اصلی آماده سازی و به سرور مورد نظر ارسال شده و در اینجا صرفا با چند خط کدنویسی و متدهای ساده جداول دیتابیس به روز شود تا مشکلات احتمالی برقراری اتصال از راه دور به دیتابیس را نداشته باشیم.
برای آپلود فایل هم می توانیم از FTP هم روش های دیگری مانند تابع curl استفاده کنیم، مثال:
$ch = curl_init("http://www.example.com/upload.php"); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, array('fileupload' => '@'.$_FILES['file']['tmp_name']));
echo curl_exec($ch);
منظورتان از اتصال دامنه را دقیق متوجه نشدیم اما اگر منظور نمایش نتیجه کدها از سرور شما در سایت مورد نظر است به نظر می توانیم با توابعی مانند curl یا file_get_contents در سایت هدف اطلاعات را در پس زمینه از سایت شما دریافت کنیم، البته در عمل باید دید چه امکاناتی مورد نیاز است و شاید استفاده از روش های دیگری مانند Ajax هم کمک کند، در هر صورت بخشی از کدها باید در سایت مورد نظر وجود داشته باشند تا وظایفی مانند پردازش فایل آپلود شده و مواردی از این دست انجام شود.
علی
۱۳:۵۶ ۱۴۰۰/۰۱/۳۰
سلام یه سوال داشتم.
فرض کنیم یه جدول داریم با حدود ۳۰۰ هزار رکورد، قصد داریم میانگین عددی فلان ستون از رکوردهایی که دارای ویژگی خاصی هستند رو بگیریم. چون تعداد رکوردها خیلی زیاده، روش سریعتری توی php هست که این مورد رو پوشش بده؟ به نظرم در زمان ذخیره کردن هر رکورد جدید، با توابع ریاضی میانگین گرفته بشه و جداگانه ذخیره بشه ، اما اگر این امکان پذیر نباشه، روشی سریعی داریم؟
اگر اطلاعات در حال حاضر ذخیره شده باشند دیگر استفاده از PHP در اولویت نیست چون ابتدا نتایج باید از دیتابیس استخراج و سپس با PHP میانگین گرفته شود، به نظر باید تمرکز را روی امکانات سیستم مدیریت دیتابیس یعنی MySQL قرار دهیم، برای گرفتن میانگین در MySQL تابع AVG کاربرد دارد، مثال:
SELECT AVG(col_1_name) FROM tbl_name WHERE col_2_name = 'value';
برای افزایش سرعت اگر پرس و جو شامل قسمت WHERE می شود می توانیم برای ستون های درگیر در این قسمت قابلیت INDEX در نظر بگیریم (از طریق برنامه phpMyAdmin قسمت Structure گزینه More و Index)، به این صورت ستون های دارای وجه مشترک با سرعت خیلی بیشتری پردازش و نتیجه آماده می شود.
اریا
۱۶:۴۷ ۱۳۹۹/۰۴/۲۰
سلام و درود بزرگوار
چه دستوری باید بنویسیم تا فقط مقدارهای خاصی از ارایه بتونیم نمایش بدیم.
مثلا یک ارایه 6 خونه ای داریم به این صورت:
0=> vahhhid@
1=> 1nedasa
2=> saaaeid@
3=> fatim
4=> nafiuu
5=> asdhkdj@
من میخوام فقط خونه هایی که اخر رشته هاشون کاراکتر @ داره را بتونم خروجی بگیرم یا چاپ کنم
خیلی ممنون میشم راهنمایی کنید به شدت احتیاج دارم
برای هدف مد نظرتان می توانید از نمونه کد زیر الگوبرداری کنید:
<?php
$array = array(
0 => 'vahhhid@',
1 => '1nedasa',
2 => 'saaaeid@',
3 => 'fatim',
4 => 'nafiuu',
5 => 'asdhkdj@'
);

foreach($array as $key => $value){
if(mb_substr($value, -1) == '@'){
echo $value . '<br>';
}
}
?>
۱۹:۰۳ ۱۳۹۸/۰۲/۱۹
سلام من میخواهم کلمات تکراری از در خروجی حذف کنم ولی نمیشه راهنمایی میکنید؟
$result2 = $db->sql_query("SELECT keyword FROM ".$prefix."_blog where keyword!='' and active=1 order by keyword asc");
while (list($keyword) = $db->sql_fetchrow($result2)) {
$names = explode('،',$keyword);
$names_unique = array_unique($names);
$ttgo = str_replace(" ", "-", $names_unique[0]);

// echo "<a href='modules.php?name=search&ttgo=".$ttgo."'><h2 class='tagh2'>".$names[$x]."</h2></a> ";
$out1 .= "<li><a href='".$site_url."search/".$ttgo."/'>".$names_unique[0]."</a></li>\n";

}
استفاده از تابع array_unique باعث حذف ایندکس های با مقادیر تکراری از آرایه می شود که در کدها این تابع وجود دارد، لذا مشکل باید از مورد دیگری باشد که نیاز به تست و اجرای برنامه دارد، در صورت تمایل با دستور var_dump در PHP از متغیر keyword و names یک نمونه خروجی بگیرید و ارسال کنید تا مشکل قابل بررسی باشد.
هادی
۰۸:۱۴ ۱۳۹۶/۰۹/۱۳
درود ممنون همون foreach کارم را راه انداخت سپاسگذارم
هادی
۱۰:۴۹ ۱۳۹۶/۰۹/۱۲
درود
فرمی دارم که یه تعداد ورودی 0 یا 1 داره نمیخوام تعداد 10 تا 12 تای آنها را به شکل زیر جمع کنم آیا راهی داره از طریق آرایه ورودی را گرفته و جمع کنم شان که در صورت تغییر تعداد تداخلی ایجاد نشه ؟
$sum=($_POST['q1']+$_POST['q2']+$_POST['q3']+$_POST['q4']+$_POST['q5']+$_POST['q6']+$_POST['q7']+$_POST['q8']+$_POST['q9']+$_POST['q10']+$_POST['q11']+$_POST['q12']);
دقیقا متوجه منظورتان نشدیم! قاعدتا تبدیل الگوی درج شده به آرایه شدنی است اما این بستگی به هدف شما دارد، شاید هیچ نیازی به آرایه نباشد و با چند دستور ساده مشکل رفع شود، ابتدا باید منظورتان را دقیقا توضیح دهید تا بهینه ترین روش را پیشنهاد دهیم، در هر صورت اگر منظور ارسال اطلاعات فرم به شکل آرایه است باید فرم را به صورت multiple ارسال کنید، مثال:
<input name="q[]" type="text">
<input name="q[]" type="text">
<input name="q[]" type="text">
و در سمت سرور با کدهای PHP آرایه را دریافت و با حلقه for یا foreach عملیات مورد نظر را بر روی مقادیر دریافتی اعمال کنید:
<?php
@$input_array = $_POST['q'];
$sum = 0;
foreach($input_array as $key => $value){
if(!empty($value)){
$sum += $value;
}
}
echo $sum;
?>
همچنین همین کد خودتان را می توانید با دستوراتی مانند isset به شیوه دیگری بازنویسی کنید، مثال:
<?php
if(isset($_POST['q1']) && !empty($_POST['q1'])){
$q1 = $_POST['q1'];
} else{
$q1 = 0;
}
if(isset($_POST['q2']) && !empty($_POST['q2'])){
$q2 = $_POST['q2'];
} else{
$q2 = 0;
}
$sum = ($q1 + $q2);
?>
majid
۰۵:۳۶ ۱۳۹۵/۱۰/۲۶
با سلام خدمت استاد محترم . چند روزی میشه روی ویرایش یک اسکریپت کار میکنم که به مشکل جالبی برخورد کردم که مبتکر این ایراد هم خودم بودم که مدعی بودم میتونستم حل کنم. به هر حال از دردل بگذریم ما یه رشته متنی داریم به این صورت
مقدار اول جدا ساز اول که : هست
مقدار دوم جدا ساز دوم که & هست
مقدار سوم جداساز سوم که = هست
و در انتها جدا ساز آخر که مقادیر اول رو از هم جدا میکنه ; هست
حال سوال اینجاست من میخوام این اطلاعات به صورت حلقه وار محدد نمایش داده بشه و از آرایه با explode هم برای تبدیل رشته متنی به آرایه استفاده بشه. یعنی با یه اطلاعات پایه مثلا جدول یا لیست مقدار اول رو تو هدر نشون بده. بعد زیرش مقدار دوم تا آخر ... به جدا ساز اصلی رسید دوباره مقدار اول تو هدر و همینطور تمامی سوالات رو ادامه بده اگر متن براتون گنگ هست به خاطر اینکه این پروژه بی نهایت محدود هست از طریق ایمیل یا هر رسانه ای که اعلام کنید مثال واقعی رو بهتون نشون خواهم داد.
ممنونم از لطفتون
اگر رشته متنی را به صورت یک مثال و نتیجه خروجی را به صورت فرضی نمایش دهید، امکان راهنمایی دقیق تر وجود خواهد داشت، در هر صورت آدرس ایمیل سایت در بخش "تماس با ما" درج شده است.
محسن
۰۹:۰۶ ۱۳۹۵/۰۳/۱۸
سلام و عرض ادب
خیلی ممنون بابت پاسختون امام تاسفانه بنده خیلی از توضیحاتش سر درنیاوردم
ممنون میشم تحت یک کوئری برام بنویسید
مثلا 10 برچسب که بیشتر از همه استفاده شدن رو بتونم نمایش بدم
برای اینگونه موارد (10 برچسب که بیشتر از همه استفاده شدن) باید کدنویسی زیاد و زمانبری صورت گیرد، ضمن اینکه در این حالت ها بهتر است ساختار دیتابیس خود را اندکی تغییر و بهبود دهید، به نحوی که با ارسال هر مطلب، جدولی برای برچسب ها مشخص شده باشد که هر برچسب یک عدد متناظر داشته باشد، به ازای استفاده از هر برچسب در مطلب، یک مقدار به عدد برچسب افزوده شود، با این کار نمایش برچسب های پر استفاده راحتتر خواهد بود تا اینکه بخواهید کل بخش مطالب را جستجو و برچسب های پر استفاده را پیدا کنید.
محسن
۰۳:۰۷ ۱۳۹۵/۰۳/۱۵
سلام و عرض ادب
بنده یک اسکریپت مدیریت محتوی نوشتم که برچسب های پست هارو توی یک ستونی از جدول پست ها ذخیره میکنه و برچسب ها با - از هم جدا میشن
حالا میخوام از بین تمام پست ها و ستون برچسب هاشون ابر برچسب ها رو نمایش بدم
ممنون میشم راهنمایی کنید
اگر فقط صرفا قصد تجزیه و نمایش برچسب ها را دارید، می توانید از تابع explode در PHP استفاده نمائید.
http://php.net/manual/en/function.explode.php
هادی
۱۳:۳۵ ۱۳۹۴/۱۱/۲۳
درود
یه آیدی ورودی دارم که میخوام مطالب مرتبط با اون آرایه را به صفحه دیگری ارسال کنم کد زیر را استفاده میکنم ولی ارسال نمیکنه لطفا راهنمایی کنید
(برای جوملا هست)
$query = 'SELECT *  FROM `#__enmasse_deal_category`  WHERE category_id IN (' . $catname  . ') ';
$db->setQuery($query);
$result = $db->loadObject();
// خروجی فقط یک مورد را ارسال میکند
//$list_id = $result->deal_id;
// تهیه لیست
$dealid = $result->deal_id;
$final_ch = NULL;
foreach($dealid as $ch){
$final_ch .='0'. $ch.';';
}
$list_id= $final_ch;
باید به دو مورد توجه کنید:
- ابتدا اینکه ممکن است پرس و جوی شما در حالت طبیعی نیز یک نتیجه برگرداند (یک نتیجه بیشتر در دیتابیس یافت نشود!).
- در صورتی که نسبت به وجود چندین رکورد مختلف با شرایط پرس و جو اطمینان دارید، باید ببینید که آرایه مربوط به متغیر dealid چند عضو دارد، برای این کار می توانید با دستور print_r اطلاعات آرایه را چاپ کنید، مثال:
$dealid = $result->deal_id;
print_r($dealid);
نکته: برای آشنایی دقیق با متدهای استاندارد جوملا در کار با دیتابیس، لطفا به انجمن های مربوطه مراجعه کنید.
مهدی
۰۰:۱۶ ۱۳۹۴/۱۰/۰۱
با سلام و عرض پوزش از اینکه این سوالو در اینجا مطرح کردم.
من منظورم این بود که با استفاده از دستورات php و به صورت آنلاین این کارو انجام بدیم. الان شما سورس این سایتو نگاه کنید :
bbsub.ir
برای کم حجم سازی html این صفحه کد php می خوام. خیلی ممنون از اینکه راهنمایی کنید.
سلام
می توانید از نمونه کد زیر استفاده کنید:
<?php
$str = '<b> </b>
<strong></strong> '
;
function trimHTML($str){
$str = preg_replace('/[[:blank:]]+/', '', $str);
return $str;
}
echo trimHTML($str);
?>
البته برای ساخت ابزار آنلاین باید کدنویسی های مربوط به بخش آپلود فایل و استخراج محتویات فایل به صورت متنی و سپس عبور از تابع فوق و در نهایت ایجاد خروجی نهایی را کدنویسی کنید!، یک راه حل جایگزین و بهتر فعال کردن حالت gzip در سرور است (باعث فشرده شدن خروجی سرور در هنگام ارسال به مرورگر می شود (البته در شکل ظاهری سورس تغییری ایجاد نمی شود!)).
مهدی
۱۴:۳۵ ۱۳۹۴/۰۹/۲۹
سلام خدمت شما و تشکر از سایت عالی تون
بسیاری از مشکلاتی را که داشتم تونستم از این جا حلشون کنم.
یه سوال داشتم. برای کم حجم کردن کد html سایت کدهای زیادی هست اما من فقط می خوام که خط هایی که خالی هستند ، حذف بشن و کدها بیان اول هر سطر . برای مثال :
<pre class="code"> 
<------ فاصله -----><div id="content" class="home clearfix">
<-- سطر خالی -->
<-- سطر خالی -->
<---- فاصله ----><div id="columns" class="clearfix">
<-- فاصله --><div id="left"></pre>
این جوری کم حجم شه :
<pre class="code">
<div id="content" class="home clearfix">
<div id="columns" class="clearfix">
<div id="left"></pre>
</pre>
سلام
لطفا سوالات را در مطالب مرتبط یا حداقل نزدیک به مبحث مطرح کنید!
برای این کار ابتدا از فایل یا فایل ها پشتیبان تهیه کنید! سپس با استفاده از امکانات برنامه ++Notepad ابتدا در قسمت Edit گزینه Blank Operations امکان Trim Leading and Trailing Space را انتخاب کنید، سپس از سربرگ Search گزینه Replace در کادر باز شده، در فیلد Find what کلیک کرده و یک بار کلید Space را بزنید، سپس بر روی Replace All کلیک کنید تا تمام فضاهای خالی اضافه حذف شوند!
more لطفا پیش از ارسال دیدگاه نکات زیر را مد نظر داشته باشید:
- به سوالات کلی، زمانبر، مبهم و مشکلاتی که تلاشی برای رفع آنها نکرده باشید پاسخ مختصر داده شده یا به بخش برنامه نویسی اختصاصی ارجاع داده می شوند.
- کدها و اسکریپت های طولانی را ترجیحا در یک صفحه وب آنلاین یا به صورت حساب موقت و آزمایشی قرار دهید تا امکان بررسی دقیق مشکل و خطایابی میسر باشد.
- تمام دیدگاه های ارسالی خوانده شده و برای هر کاربر مدت زمان لازم جهت پاسخگویی در نظر گرفته می شود، لطفا از طرح سوالات متعدد در بازه زمانی کوتاه خودداری کنید.



 refresh
10 × 10
7 × 7
20 × 20
=