ویژگی تصویر

تابع key() در PHP

  /  PHP   /  تابع key() در PHP
بنر تبلیغاتی الف
آموزش PHP

تابع key() در PHP برای دریافت «کلید» (index) عنصر جاری یک آرایه استفاده می‌شود. این تابع کلید عنصرِ موقعیت فعلی نشانگر داخلی آرایه را برمی‌گرداند. درک رفتار key() نیاز به شناخت نشانگرِ داخلی آرایه (internal pointer) و توابع مرتبط مثل current(), next(), reset() و end() دارد.

خروجی و نوع بازگشتی

تابع key() می‌تواند مقدارهایی از نوع int یا string برگرداند و در صورتی که نشانگر داخلی از انتهای آرایه عبور کرده باشد مقدار NULL بازمی‌گرداند. نکته مهم این است که بررسی اشتباه مقدار برگشتی می‌تواند باعث خطا شود، چون کلید ممکن است مقدار 0 باشد که در مقایسه غیرسخت (==) با false برابر گرفته می‌شود؛ بنابراین همیشه از مقایسه سخت (===) یا بررسی !== null استفاده کنید.

توابع مرتبط

  • current() — مقدار عنصر جاری را برمی‌گرداند.
  • next() — نشانگر را به عنصر بعدی منتقل می‌کند.
  • prev() — نشانگر را به عنصر قبلی منتقل می‌کند.
  • reset() — نشانگر را به اولین عنصر برمی‌گرداند.
  • end() — نشانگر را به آخرین عنصر می‌برد.
  • array_key_first(), array_key_last() — توابع جدید برای گرفتن اولین/آخرین کلید بدون تغییر نشانگر داخلی (از PHP 7.3).

مثال‌های عملی

استفاده پایه‌ای با نشانگر داخلی

$arr = ['a' => 'apple', 'b' => 'banana', 'c' => 'cherry'];

reset($arr); // اطمینان از اینکه نشانگر به ابتدای آرایه برگشته
echo key($arr); // خروجی: a

next($arr);
echo key($arr); // خروجی: b

end($arr);
echo key($arr); // خروجی: c

next($arr);
var_dump(key($arr)); // خروجی: NULL (از انتها عبور کرده)

در این کد ابتدا با reset() نشانگر را به ابتدای آرایه می‌بریم. سپس با key() کلید عنصر جاری را می‌خوانیم. با next() نشانگر جلو می‌رود و در نهایت وقتی از انتهای آرایه عبور کند key() مقدار NULL برمی‌گرداند.

حساسیت به نوع بازگشتی — مثال اشتباه رایج

$nums = [0 => 'zero', 1 => 'one'];

reset($nums);
if (key($nums) == false) {
    echo 'no key or key is false-like';
} else {
    echo 'has key';
}

در این مثال key() مقدار 0 را برمی‌گرداند. چون 0 در مقایسه غیرسخت == برابر false محسوب می‌شود، شرط بالا اشتباه عمل می‌کند. راه درست استفاده از مقایسه سخت است:

reset($nums);
if (key($nums) === null) {
    echo 'no key';
} else {
    echo 'key is: ' . key($nums);
}

در نسخه اصلاح‌شده از === برای تشخیص دقیق NULL استفاده شده است تا کلیدِ 0 اشتباهاً نادیده گرفته نشود.

استفاده در حلقه‌های مبتنی بر نشانگر

اگر بخواهید دقیقاً بر مبنای نشانگر داخلی آرایه پیمایش کنید (مثلاً نیازمند دسترسی هم‌زمان به کلید و مقدار و کنترل دستی نشانگر)، می‌توانید از ساختار while همراه با key() و current() استفاده کنید:

$arr = ['x' => 10, 'y' => 20, 'z' => 30];

reset($arr);
while (key($arr) !== null) {
    $k = key($arr);
    $v = current($arr);
    echo "$k => $vn";
    next($arr);
}

در این مثال حلقه تا زمانی که نشانگر به پایان نرسیده ادامه دارد. با key() و current() به ترتیب کلید و مقدار عنصر جاری خوانده می‌شوند و سپس با next() به عنصر بعدی می‌رویم.

تفاوت با foreach و نکات مهم

تابع foreach در اغلب نسخه‌های PHP از نشانگر داخلی آرایه استفاده نمی‌کند؛ به همین دلیل خواندن key() داخل یک حلقه foreach معمولاً مقدار کلید فعلی نشانگر داخلی را نمایش نمی‌دهد و رفتار متفاوتی دارد. به طور معمول اگر فقط لازم است همه عناصر را پیمایش کنید، foreach ساده‌تر و امن‌تر است:

$arr = ['p' => 1, 'q' => 2];

foreach ($arr as $k => $v) {
    echo "$k => $vn"; // کلید و مقدار درست چاپ می‌شود
}

در این صورت نیازی به key() و مدیریت دستی نشانگر نیست. اما اگر به دلایلی مجبور به استفاده از نشانگر داخلی باشید (مثلاً برای ادامه از جایی که قبلاً متوقف شده‌اید)، از توابع pointer-based استفاده کنید.

بهترین شیوه‌ها و نکات حرفه‌ای

  • برای دریافت اولین کلید از array_key_first() (PHP 7.3+) استفاده کنید؛ خواناتر و سریع‌تر و بدون تغییر نشانگر داخلی است.
  • همیشه برای بررسی انتهای آرایه از === null استفاده کنید، نه مقایسه غیرسخت با false.
  • اگر فقط نیاز به پیمایش دارید، از foreach استفاده کنید؛ مگر اینکه نیاز مشخصی به کنترل نشانگر داخلی داشته باشید.
  • دقیقا بدانید که آیا توابع شما قرار است آرایه را از نظر pointer تغییر دهند یا نه؛ reset() و next() حالت آرایه را تغییر می‌دهند.

مقایسه سریع توابع مرتبط

هدفتابع/روشنکته
گرفتن کلید عنصر جاریkey()وابسته به نشانگر داخلی
اولین کلید بدون تغییر نشانگرarray_key_first()از PHP 7.3؛ توصیه‌شده
پیمایش سادهforeachنیازی به key() و مدیریت نشانگر نیست

خاتمه و نتیجه‌گیری

تابع key() ابزار قدرتمندی برای مواقعی است که لازم دارید کنترل دقیق روی نشانگر داخلی آرایه داشته باشید یا کلید عنصر جاری را بدون استفاده از foreach بخوانید. با این حال، برای اغلب کاربردهای معمولی، استفاده از foreach یا توابع جدید مانند array_key_first خواناتر، سریع‌تر و ایمن‌تر هستند. همیشه رفتار بازگشتی key() را با === null بررسی کنید تا با کلیدهای عددی مانند 0 دچار خطای منطقی نشوید.

آیا این مطلب برای شما مفید بود ؟

خیر
بله
موضوعات شما در انجمن: