سؤال

في php, أنا غالبا ما تحتاج إلى خريطة متغير باستخدام مجموعة ...ولكن أنا لا يبدو أن تكون قادرة على القيام بذلك في سفينة واحدة.ج.f.على سبيل المثال:

// the following results in an error:
echo array('a','b','c')[$key];

// this works, using an unnecessary variable:
$variable = array('a','b','c');
echo $variable[$key];

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

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

المحلول

لا تهتم حول أن إضافي متغير, حقا.إذا كنت تريد, على الرغم من أنك يمكن أيضا إزالتها من الذاكرة بعد أن كنت قد استخدمت:

$variable = array('a','b','c');
echo $variable[$key];
unset($variable);

أو يمكنك أن تكتب وظيفة صغيرة:

function indexonce(&$ar, $index) {
  return $ar[$index];
}

و الاتصال مع:

$something = indexonce(array('a', 'b', 'c'), 2);

مجموعة يجب أن يتم تدميرها تلقائيا الآن.

نصائح أخرى

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

وإليك بعض الأمثلة على بطلان هذا النحو على صالح التعبيرات:

$x = array(1,2,3);
print ($x)[1]; //illegal, on a parenthetical expression, not a variable exp.

function ret($foo) { return $foo; }
echo ret($x)[1]; // illegal, on a call expression, not a variable exp.

وهذا ما يسمى مجموعة dereferencing.تم إضافته في php 5.4.http://www.php.net/releases/NEWS_5_4_0_alpha1.txt

تحديث[2012-11-25]: كما من PHP 5.5 ، dereferencing قد أضيفت إلى contants/سلاسل وكذلك المصفوفات

هذا قد لا تكون ذات صلة مباشرة..ولكن جئت إلى هذا المنصب إيجاد حل لهذه المشكلة بالتحديد.

حصلت على النتيجة من خلال وظيفة في الشكل التالي.

Array
(
    [School] => Array
            (
                [parent_id] => 9ce8e78a-f4cc-ff64-8de0-4d9c1819a56a
            )
)

ما أردت كان parent_id قيمة "9ce8e78a-f4cc-ff64-8de0-4d9c1819a56a".أنا استخدم وظيفة مثل هذا وحصلت عليه.

array_pop( array_pop( the_function_which_returned_the_above_array() ) )

لذلك ، تم القيام به في سطر واحد :) نأمل أنه سيكون من المفيد أن شخص ما.

function doSomething()
{
    return $somearray;
}

echo doSomething()->get(1)->getOtherPropertyIfThisIsAnObject();

في الواقع ، هناك حل رائع:) التالية سيتم تعيين 3 عنصر من المصفوفة التي تم إرجاعها بواسطة myfunc إلى $myvar:

$myvar = array_shift(array_splice(myfunc(),2));

أو شيئا من هذا القبيل, إذا كنت بحاجة إلى مجموعة قيمة في متغير

$variable = array('a','b','c');
$variable = $variable[$key];

هناك عدة oneliners هل يمكن أن تأتي مع استخدام php array_* المهام.ولكن أود أن أؤكد لكم أن ذلك هو مجموع زائدة مقارنة ما تريد تحقيقه.

على سبيل المثال يمكنك استخدام شيء مثل التالية ، ولكنه ليس حلا و أنا غير متأكد حول أداء هذا ؛

   array_pop ( array_filter( array_returning_func(), function($key){    return $key=="array_index_you_want"? TRUE:FALSE;    },ARRAY_FILTER_USE_KEY ) );

إذا كنت تستخدم إطار php و كنت عالقة مع نسخة قديمة من php, معظم أطر مساعدة المكتبات.

على سبيل المثال:Codeigniter مجموعة المساعدين

على الرغم من حقيقة أن dereferencing تم إضافتها في PHP >=5.4 كنت قد فعلت ذلك في سطر واحد باستخدام مشغل الثلاثي:

echo $var=($var=array(0,1,2,3))?$var[3]:false;

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

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