سؤال

في بيرل، ويمكنني أن تعيين قائمة على قيم متعددة في تجزئة، كما يلي:

# define the hash...
my %hash = (
  foo => 1,
  bar => 2,
  baz => 3,
);

# change foo, bar, and baz to 4, 5, and 6 respectively
@hash{ 'foo', 'bar', 'baz' } = ( 4, 5, 6 );

هل هناك أي طريقة لتفعل الشيء نفسه في بي؟ في الواقع، ليس هناك حتى وسيلة للحصول على شريحة من مجموعة ASSOC على الإطلاق؟

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

المحلول

وليس هناك ما يعادل بناء الجملة بيرل. ولكن يمكنك أن تجعل مجموعة من مفاتيح الفائدة واستخدام ذلك لتغيير الجزء الوحيد من مجموعة الخاصة بك.

$koi=array('foo', 'bar', 'baz' );
foreach($koi as $k){
  $myarr[$k]++; //or whatever
}

أو

array_walk($myarr, create_function('&$v,$k','$v=(in_array($k,$koi))? $v*2 : $v;')); //you'd have to define $koi inside the function

نصائح أخرى

وبسيطة أونيلينير (بعض من هذه الأساليب تتطلب إصدارات أحدث من PHP مما كان متاحا في ذلك الوقت من يسأل):

$hash = array(
    'foo'=>1,
    'bar'=>2,
    'baz'=>3,
);

$hash = array_merge( $hash, array( 'foo' => 4, 'bar' => 4, 'baz' => 5 ) );

وPHP الإدخال اليدوي لل array_merge .

إذا كنت تبحث للحصول على مجموعة من مفاتيح مجموعة معينة، يمكنك استخدام هذا:

$subset = array_intersect_key( $hash, array_fill_keys( array( 'foo', 'baz' ), '' ) );

وPHP إدخالات دليل لل array_intersect_key و array_fill_keys .

وتحديد التجزئة:

$hash = array(
  'foo' => 1,
  'bar' => 2,
  'baz' => 3,
);

# change foo, bar, and baz to 4, 5, and 6 respectively
list($hash['foo'], $hash['bar'], $hash['baz']) = array( 4, 5, 6 );

# or change one by one
$hash['foo'] = 1;
$hash['bar'] = 2;
$hash['baz'] = 3;

واطلع على وظيفة القائمة () في دليل:

http://php.net/manual/en/function.list.php

وباختصار، لا. ومع ذلك، يمكنك استخدام وظيفة من هذا القبيل:

function assignSlice($ar,$keys,$args) {
  if (count($keys) !== count($args)) {
    // may want to handle more gracefully;
    // simply returns original if numbers of keys and values
    // don't match
    return $ar;
  }                                                 
  foreach ($keys as $index=>$key) {
    $ar[$key] = $args[$index];
  }
  return $ar;
}

$test = array(
    'foo'=>1,
    'bar'=>2,
    'baz'=>3,
    );

$newtest = assignSlice($test,array('foo','bar'),array(4,5));

وتحرير: تعديل التعليمات البرمجية في تعليق استجابة OP على السؤال

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