تشريح متعدد الأبعاد PHP مجموعة عبر أحد عناصرها

StackOverflow https://stackoverflow.com/questions/163336

  •  03-07-2019
  •  | 
  •  

سؤال

ويقول على سبيل المثال فقط الاستعلام قاعدة بيانات وأن تلقوا هذه المجموعة 2D.

$results = array(
    array('id' => 1, 'name' => 'red'  , 'spin' =>  1),
    array('id' => 2, 'name' => 'green', 'spin' => -1),
    array('id' => 3, 'name' => 'blue' , 'spin' => .5)
);

وكثيرا ما أجد نفسي كتابة الحلقات من هذا القبيل.

foreach($results as $result)
    $names[] = $result['name'];

وأسئلتي ولا توجد هناك طريقة للحصول على هذه المجموعة أسماء $ دون استخدام حلقة؟ عد باستخدام وظائف الاستدعاء مثل استخدام حلقة.

وهنا هو مثال أكثر عمومية من الحصول على كل مجال.

foreach($results as $result)
    foreach($result as $key => $value)
        $fields[$key][] = $value;
هل كانت مفيدة؟

المحلول

واعتبارا من 20 يونيو في PHP-5.5 هناك وظيفة جديدة array_column

وعلى سبيل المثال:

$records = array(
    array(
        'id' => 2135,
        'first_name' => 'John',
        'last_name' => 'Doe'
    ),
    array(
        'id' => 3245,
        'first_name' => 'Sally',
        'last_name' => 'Smith'
    ),
    array(
        'id' => 5342,
        'first_name' => 'Jane',
        'last_name' => 'Jones'
    ),
    array(
        'id' => 5623,
        'first_name' => 'Peter',
        'last_name' => 'Doe'
    )
);


$firstNames = array_column($records, 'first_name');
print_r($firstNames);

وسيعود

Array
(
    [0] => John
    [1] => Sally
    [2] => Jane
    [3] => Peter
)

وهناك المزيد من الأمثلة في الرابط المذكور أعلاه.

نصائح أخرى

ولقد صوت @ استجابة ديفون يصل لأن هناك في الحقيقة ليست وسيلة لتحقيق ما كنت طالبا مع وظيفة المضمنة. أفضل ما يمكن فعله هو كتابة الخاصة بك:

function array_column($array, $column)
{
    $ret = array();
    foreach ($array as $row) $ret[] = $row[$column];
    return $ret;
}

بدء PHP 5.3، يمكنك استخدام هذه الدعوة جميلة مع وظيفة امدا:

$names = array_map(function ($v){ return $v['name']; }, $results);

وهذا سيعود مجموعة شرائح حسب البعد 'اسم'.

وببساطة، لا.

وسوف تحتاج إلى استخدام حلقة أو وظيفة رد مثل array_walk .

وفعلت المزيد من الأبحاث حول هذا الموضوع وجدت أن روبي والنموذج على حد سواء لديهم وظيفة أن يفعل هذا يسمى <لأ href = "http://us.php.net/manual/en/function.array-map.php# 82256 "يختلط =" noreferrer نوفولو "> array_pluck أو 2 . من المثير للاهتمام أن array_map لديه الاستخدام الثاني الذي يسمح لك أن تفعل عكس ما أريد القيام به هنا. كما أنني وجدت PHP الطبقة شخص يكتب لمحاكاة نماذج التلاعب المصفوفات.

وانا ذاهب الى القيام ببعض أكثر حفر حولها وإذا أنا لا أجد أي شيء آخر سوف أعمل على التصحيح أن يقدم إلى القائمة البريدية internals@lists.php.net ومعرفة ما اذا كانت ستضيف array_pluck.

لذلك عليك أن لا يمكن الترقية إلى PHP5.5 الآن وتحتاج هذه الوظيفة، وهنا هو تنفيذ array_column.

function array_column($array, $column){
    $a2 = array();
    array_map(function ($a1) use ($column, &$a2){
        array_push($a2, $a1[$column]);
    }, $array);
    return $a2;
}

إذا كنت تقوم بتشغيل نسخة من PHP قبل 5.5 و array_column()، يمكنك استخدام استبدال الرسمي في PHP عادي:

https://github.com/ramsey/array_column

وأعتقد أن هذا سوف تفعل ما تريد

array_uintersect_uassoc

وأنت يجب أن تفعل شيئا مثل هذا

$results = array(
    array('id' => 1, 'name' => 'red'  , 'spin' =>  1),
    array('id' => 2, 'name' => 'green', 'spin' => -1),
    array('id' => 3, 'name' => 'blue' , 'spin' => .5)
);
$name = array_uintersect_uassoc( $results, array('name' => 'value')  , 0, "cmpKey");
print_r($name);

//////////////////////////////////////////////////
// FUNCTIONS
//////////////////////////////////////////////////
function cmpKey($key1, $key2) {
  if ($key1 == $key2) {
    return 0;
  } else {
    return -1;
  }
}

ولكن، ليس لدي الوصول إلى PHP5 حتى انني لم اختبر هذا.

هل يمكن أن تفعل:

$tmp = array_flip($names);
$names = array_keys($tmp);

وهذا هو البديل وظيفة سريع من array_column ()

if(!function_exists('array_column')) {
    function array_column($element_name) {
        $ele =   array_map(function($element) {
            return $element[$element_name];
        }, $a);
        return  $ele;
    }
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top