سؤال

لدي صفيف بسيط:

array
  0 => string 'Kum' (length=3)
  1 => string 'Kumpel' (length=6)

عندما أقوم بتشفير الصفيف باستخدام JSON_ENCODE ()، أحصل على ذلك:

["Kum","Kumpel"] 

سؤالي هو، ما هو السبب في الحصول عليه ["Kum","Kumpel"] بدلا من { "0" : "Kum", "1" : "Kumpel" }?

هل كانت مفيدة؟

المحلول

بين قوسين "{}" تحدد كائن و [] تستخدم للمصفوفات وفقا لمواصفات JSON. المصفوفات لا تحتوي على تعداد، إذا نظرت إليها من منظور تخصيص الذاكرة. إنها مجرد بيانات تليها المزيد من البيانات، والكائنات من يد أخرى لديها خصائص مع أسماء ويتم تعيين البيانات إلى الخصائص، وبالتالي لتشفير هذا الكائن، يجب أيضا تمرير أسماء الممتلكات الصحيحة أيضا. ولكن بالنسبة للمصفف، لا تحتاج إلى تحديد الفهارس، لأنها ستكون دائما 0..N، حيث ن هو طول الصفيف - 1، الشيء الوحيد الذي يهم هو ترتيب البيانات.

$array = array("a","b","c");
json_encode($array); // ["a","b","c"]
json_encode($array, JSON_FORCE_OBJECT); // {"0":"a", "1":"b","2":"c"}

السبب الذي يرغي JSON_FORCE_OBJECES عليه استخدام "0،1،2" هو أنه لتعيين البيانات التي يجب عليك تعيينها، يجب عليك تعيينها إلى خاصية، نظرا لعدم توفر أي أسماء خاصية بواسطة المطور (فقط البيانات) يستخدم Encoder فهارس الصفيف كخاصية أسماء، لأن تلك هي الأسماء الوحيدة التي من شأنها أن تكون منطقية.

ملاحظة: وفقا ل دليل PHP تتوفر معلمات الخيارات فقط من PHP 5.3.

في إصدارات PHP القديمة تشير إلى إجابة Chelmertz للحصول على وسيلة لجعل JSON_Encode لاستخدام الفهارس.

نصائح أخرى

كما قال Gumbo، على الجانب JS، لن يهم الأمر. لإجبار PHP في ذلك، جرب هذا:

$a = new stdClass();
$a->{0} = "Kum";
$a->{1} = "Kumpel";
echo json_encode($a);

ليس هذا قابلا للاستخدام، سألتزم بتدوين الصفيف.

فقط يلقي ككائن وسيعمل بشكل جيد ... تعلم المعلمة JSON_FORCE_OBJECT بالضبط نفس الشيء.

json_encode((object)$array);

لا تنس إدخاله مرة أخرى إلى مجموعة PHP حتى تتمكن من الوصول إلى قيمها في PHP:

$array = (object)$array;
$array = (array)$array;

json_encode($array);

نظرا لأنك تواجه مجموعة PHP مع مفاتيح رقمية فقط، فلا حاجة لاستخدام كائن JavaScript. ولكن إذا كنت بحاجة إلى واحدة، فجرب اقتراح مايكو موري.

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

صفيف ("0" => صفيف (0،1،2،3)، "1" => صفيف (4،5،6،7))؛

ويجب تحويلها إلى

{"0": [0,1,2,3], "1": [4,5,6,7]}

بعد PHP تتوقع مني إما القبول

[[0,1,2,3],[4,5,6,7]]

أو

{"0":{"0":1,"1":1,"2":2,"3":3},"1":{"0":4,"1":5,"2":6,"3":7}}

لا أحد منهم على الإطلاق. كيف يمكنني فك شفرة كائن من هذا القبيل؟ ما السبب المحتمل هو هناك تغيير من أي وقت مضى شيء يستخدم بوضوح سلاسل الفهارس؟ إنه مثل PHP كان يحاول أن يكون ذكيا لمساعدة الأشخاص الغبيين الذين لا يستطيعون التمييز بين الأوتار من Ints، ولكن في العملية افسدت أي شخص باستخدام سلاسل مشروعة كهارس، بغض النظر عن ما يمكن تحويل القيمة إليه.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top