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

طباعة القيم وعرضها في PHP


سارة محمد2

من المفيد لبناء برنامج PHP ديناميكي وتفاعلي أن تحصل على خرج من المتغيرات وقيمتها، توفر PHP عدة توابع لعرض قيمة ما، يغطي هذا الفصل التوابع الأساسية لطباعة قيمة في PHP وأين يمكن استخدامها.

echo وprint

تعدّ echo وprint من بنى اللغة وليست دوالًا، لذلك لا حاجة لاستخدام الأقواس لتمرير الوسائط إليها كما نفعل في الدوال (بالرغم من أنه يمكننا دائمًا إضافة أقواس حول أي تعبير PHP لذا يمكننا كتابة echo‎("test‎")‎ دون أيّة مشكلة)، وخرجهما عبارة عن تمثيل سلسلة لمتغير أو ثابت أو تعبير ولا يمكن استخدامهما لطباعة مصفوفات أو كائنات.

  • إسناد السلسلة Joel للمتغير ‎$name:
$name = "Joel";
  • خرج قيمة المتغير ‎$name باستخدام echo وprint:
echo $name; 
// Joel

print $name; 
// Joel
  • الأقواس غير ضرورية إلا أنّه يمكنك استخدامها:
echo($name); 
// Joel

print($name); 
// Joel
  • استخدام عدة معاملات (مع echo فقط):
echo $name, "Smith"; 
// JoelSmith

echo($name, " ", "Smith"); 
// Joel Smith
  • print هي تعبير يرجع القيمة 1 لذا يمكن أن يكون استخدامها مفيدًا أكثر من echo في بعض الحالات:
print("hey") && print(" ") && print("you"); 
// you11

تكافئ الشيفرة السابقة مايلي:

print ("hey" && (print (" " && print "you"))); 
// you11

الصياغة المختصرة للبنية echo

من الممكن افتراضيًا استخدام الصياغة المختصرة عند استخدام وسوم PHP خارج شيفرة PHP، وذلك بدءًا بوسم البداية ‎<?=‎ وانتهاءً بوسم النهاية ‎?>‎، مثال عن ذلك:

<p><?=$variable?></p>
<p><?= "This is also PHP" ?></p>

لاحظ أنّه لم يتم الإنهاء باستخدام الفاصلة المنقوطة ;، إلا أنّ هذه الشيفرة تعمل بشكلٍ صحيحٍ لأن وسم نهاية PHP ينهي كل تعليمة، لذلك تُحذف عادةً الفاصلة المنقوطة في الصياغة المختصرة.

أولوية البنية print

على الرغم من أن print بنية لغة إلا أنّ لها أولوية مثل العامل (operator)، وتوضع بين = += -= *= **= /= .= %= &= والعوامل وتترك ارتباطها. مثال:

echo '1' . print '2' + 3; 
// 511

نفس المثال مع أقواس:

echo '1' . print ('2' + 3); 
// 511

الفروقات بين echo وprint

باختصار، هناك فارقين أساسيّين بينهما:

  • تأخذ print معاملًا واحدًا فقط بينما يمكن أن تأخذ echo عدة معاملات.
  • ترجع print قيمة لذا يمكن استخدامها تعبيرًا (expression).

إظهار عرض بنيوي للمصفوفات والكائنات

الدالة ‎print_r()‎: تعرض المصفوفات والكائنات لتنقيح الأخطاء (debugging) وتُظهر المصفوفة أو الكائن بتنسيقٍ مقروءٍ من قِبل الإنسان.

إذا كان لديك متغير عبارة عن كائن أو مصفوفة وحاولت عرضه مستخدمًا echo، فإنّ ذلك سيرمي الخطأ Notice: Array to string conversion، يمكنك استخدام الدالة print_r بدلًا منها لإظهار المتغير بتنسيقٍ مقروء من قبل الإنسان، ويمكنك تمرير true معاملًا ثانيًا للحصول على المحتوى بشكل سلسلة نصية.

$myobject = new stdClass();
$myobject->myvalue = 'Hello World';
$myarray = [ "Hello", "World" ];
$mystring = "Hello World";
$myint = 42;

// لعرض بيانات مصفوفة print_r نستخدم
print_r($myobject);
print_r($myarray);
print_r($mystring);
print_r($myint);

خرج الشيفرة السابقة هو:

stdClass Object
(
    [myvalue] => Hello World
)
Array
(
    [0] => Hello
    [1] => World
)
Hello World
42

بالإضافة إلى ذلك يمكن أن نحصل على خرج الدالة print_r بشكل سلسلة نصية بدلًا من طباعته بشكلٍ بسيط، مثلًا تعرض الشيفرة التالية النسخة المنسّقة من ‎$myarray في متغير جديد:

$formatted_array = print_r($myarray, true);

لاحظ أنّه إذا كنت تعرض خرج PHP في متصفح ويتم ترجمته إلى HTML فلن يتم عرض فواصل الأسطر وسيكون الخرج أقل وضوحًا إلا إذا كتبت كالتالي:

echo '<pre>' . print_r($myarray, true) . '</pre>';

لاحظ أنّ فتح الشيفرة المصدرية لصفحة ما سيكتب متغيرك بنفس التنسيق أيضًا بدون استخدام الوسم <pre>.

يمكنك بدلًا من ذلك أن تخبر المتصفح أن ما تعرضه هو نص عادي وليس HTML:

header('Content-Type: text/plain; charset=utf-8');
print_r($myarray);

الدالة var_dump()‎: خرجها عبارة عن معلومات تنقيح قابلة للقراءة من قِبل الإنسان حول محتوى الوسيط (الوسطاء) متضمنةً نوعه وقيمته، وخرج هذه الدالة أكثر تفصيلًا من خرج الدالة print_r لأنّ خرجها أيضًا نوع المتغير وقيمته ومعلومات أخرى مثل معرّف الكائن، حجم المصفوفة، طول السلسلة النصية، مؤشر المرجع وغير ذلك…، لذا يمكنك استخدام var_dump لإخراج نسخة أكثر تفصيلًا للتنقيح.

var_dump($myobject, $myarray, $mystring, $myint);

لاحظ أنّ الخرج أكثر تفصيلًا:

object(stdClass)#12 (1) {
    ["myvalue"]=>
        string(11) "Hello World"
}
array(2) {
    [0]=>
        string(5) "Hello"
    [1]=>
        string(5) "World"
}
string(11) "Hello World"
int(42)

لاحظ أنّه إذا استخدمت المنقّح xDebug في بيئة التطوير فإنّ خرج var_dump سيكون محدودًا بشكلٍ افتراضي. يمكنك الاطلاع على التوثيق الرسمي لمزيدٍ من المعلومات حول خيارات تغيير هذا الإعداد الافتراضي.

var_export()‎: تُخرج هذه الدالة شيفرة PHP صالحة، وتعيد تمثيل المتغير. يمكنك أن تمرر true معاملًا ثانيًا لترجع المحتويات في متغير.

var_export($myarray);
var_export($mystring);
var_export($myint);

الخرج هو شيفرة PHP صالحة:

array (
    0 => 'Hello',
    1 => 'World',
)
'Hello World'
42

يمكنك أن تفعل التالي لتضع المحتوى في متغير:

$array_export = var_export($myarray, true);
$string_export = var_export($mystring, true);
$int_export = var_export($myint, 1); // أي قيمة توكيد

بعد ذلك يمكنك إخراجها كالتالي:

printf('$myarray = %s; %s', $array_export, PHP_EOL);
printf('$mystring = %s; %s', $string_export, PHP_EOL);
printf('$myint = %s; %s', $int_export, PHP_EOL);

ستخرج هذه الشيفرة الخرج التالي:

$myarray = array (
    0 => 'Hello',
    1 => 'World',
);
$mystring = 'Hello World';
$myint = 42;

ربط السلاسل النصية باستخدام echo

يمكنك استخدام الربط (concatenation) لربط السلاسل "نهاية إلى نهاية" عند إخراجها (باستخدام echo أو print مثلًا)، يمكنك دمج المتغيرات باستخدام . (نقطة).

//متغير بشكل سلسلة نصية
$name = 'Joel';

// ربط عدة سلاسل نصية (3 سلاسل في مثالنا) في سلسلة نصية واحدة ثم طباعتها
echo '<p>Hello ' . $name . ', Nice to see you.</p>';

// "<p>Hello Joel, Nice to see you.</p>"

وبطريقة مشابهة للربط يمكننا استخدام echo (بدون أقواس) لربط السلاسل والمتغيرات معًا (بالإضافة إلى التعابير العشوائية الأخرى) باستخدام الفاصلة (,).

$itemCount = 1;
echo 'You have ordered ', $itemCount, ' item', $itemCount === 1 ? '' : 's';

// "You have ordered 1 item"

موازنة بين دمج السلاسل وتمرير عدة وسائط للبنية echo

يعدّ تمرير عدة وسائط للبنية echo أفضل من دمج السلاسل في بعض الحالات، تُكتب الوسائط في الخرج بنفس الترتيب الذي تُمرّر به.

echo "The total is: ", $x + $y;

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

echo "The total is: " . ($x + $y);

printf أو sprintf

الدالة printf تعرض سلسلة منسقة باستخدام بدائل. الدالة sprintf ترجع سلسلة منسقة.

$name = 'Jeff';
// أن تتوقع سلسلة نصية PHP `%s` تخبر
printf("Hello %s, How's it going?", $name);

// Hello Jeff, How's it going?

// بدلًا من إخراجها مباشرة ($greeting) وضعها في متغير
$greeting = sprintf("Hello %s, How's it going?", $name);
echo $greeting;

// Hello Jeff, How's it going?

من الممكن أيضًا تنسيق عدد باستخدام هاتين الدالتين، مثلًا عند تنسيق قيمة عشرية لتمثيل المال إذ يوجد لدينا دائمًا رقمين عشريين.

$money = 25.2;
printf('%01.2f', $money);
// 25.20 الخرج

تعمل الدالتان vprintf وvsprintf مثل printf وsprintf لكنهما تقبلان سلسلة تنسيق ومصفوفة من القيم بدلًا من المتغيرات الفردية.

إظهار أعداد صحيحة كبيرة

تُحوّل الأعداد الصحيحة الكبيرة الأكبر من PHPINTMAX تلقائيًا إلى أعداد عشرية (float) في أنظمة 32 بت، يمكن إظهار هذه القيم الصحيحة (أي التدوين غير العلمي) بالدالة printf مستخدمًا التمثيل العشري كما هو موضح في الشيفرة التالية:

foreach ([1, 2, 3, 4, 5, 6, 9, 12] as $p) {
    $i = pow(1024, $p);
    printf("pow(1024, %d) > (%7s) %20s %38.0F", $p, gettype($i), $i, $i);
    echo " ", $i, "\n";
}

// الخرج
pow(1024, 1) integer                 1024                 1024                 1024
pow(1024, 2) integer             1048576             1048576             1048576
pow(1024, 3) integer         1073741824         1073741824         1073741824
pow(1024, 4) double    1099511627776    1099511627776    1099511627776
pow(1024, 5) double 1.1258999068426E+15 1125899906842624
1.1258999068426E+15
pow(1024, 6) double 1.1529215046068E+18 1152921504606846976
1.1529215046068E+18
pow(1024, 9) double 1.2379400392854E+27 1237940039285380274899124224
1.2379400392854E+27
pow(1024, 12) double 1.3292279957849E+36 1329227995784915872903807060280344576
1.3292279957849E+36

ملاحظة: انتبه من دقة الأعداد العشرية اللانهائية.

يمكن في هذا المثال المبتكر تمثيل جميع الأعداد كعدد ثنائي لأنّها كلها قوى العدد 1024 (وبالتالي 2)، مثلًا:

$n = pow(10, 27);
printf("%s %.0F\n", $n, $n);
// 1.0E+27 1000000000000000013287555072

إظهار مصفوفة متعددة الأبعاد مع الفهرس والقيمة وطباعتها ضمن جدول

Array
(
    [0] => Array
        (
            [id] => 13
            [category_id] => 7
            [name] => Leaving Of Liverpool
            [description] => Leaving Of Liverpool
            [price] => 1.00
            [virtual] => 1
            [active] => 1
            [sort_order] => 13
            [created] => 2007-06-24 14:08:03
            [modified] => 2007-06-24 14:08:03
            [image] => NONE
        )
[1] => Array
        (
            [id] => 16
            [category_id] => 7
            [name] => Yellow Submarine
            [description] => Yellow Submarine
            [price] => 1.00
            [virtual] => 1
            [active] => 1
            [sort_order] => 16
            [created] => 2007-06-24 14:10:02
[modified] => 2007-06-24 14:10:02
[image] => NONE
        )
)

إظهار مصفوفة متعددة الأبعاد مع الفهرس والقيمة في جدول

<table>
<?php
foreach ($products as $key => $value) {
    foreach ($value as $k => $v) {
        echo "<tr>";
        echo "<td>$k</td>"; // Get index.
        echo "<td>$v</td>"; // Get value.
        echo "</tr>";
    }
}
?>
</table>

ترجمة -وبتصرف- للفصل [Outputting the Value of a Variable] من كتاب PHP Notes for Professionals book

اقرأ أيضًا


تفاعل الأعضاء

أفضل التعليقات

لا توجد أية تعليقات بعد



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

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

زائر
أضف تعليق

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   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.


×
×
  • أضف...