简体   繁体   中英

php Multidimensional Array for key and get value

I have the following code sample:

$arr = array(
  array(
    'packid'=> '1', 'total' => '30'),
  array(
    'packid'=> '2', 'total' => '20')
);

$arr is in a loop

 foreach ($pack->memberPack as $memPack) {
            if($memPack->packId = $search_arr_key)
            //get the `total` value then do something
        }

and $memPack object like this:

array(1) {
["memberPack"]=>
array(1) {
  [0]=>
  object(MemberPack)#290 (6) {
    ["errors"]=>
    NULL
    ["attributes":"ActiveRecord\Model":private]=>
    array(3) {
      ["memberPackId"]=>
      int(1)
      ["packId"]=>
      int(1)
      ["memberId"]=>
      int(14369)
    }  
  }
}

}

How can i search the key packId equal to $memPack->packId and get the match total? (ex. if packId =2 and get the value 20 )

I think you are looking for a loop that finds the result according to the packid you select.

<?php

$arr = array(
  array(
    'packid'=> '1', 'total' => '30'),
  array(
    'packid'=> '2', 'total' => '20')
);

$whateverPackidYouWant = 2;
$answer;

for ($i = 0; $i < count($arr); $i++) {

if ($arr[$i]['packid'] == $whateverPackidYouWant) {
   $answer = $arr[$i]['total'];
}

}

echo $answer;

?>

Please let me know if this is what you were looking for.

Simply iterate the array and check if the subarray contains the matching packid and total items. Break the loop on the first match:

$packid = 2;

foreach ($arr as $k => $v) {
  if ($v['packid'] == $packid && isset($v['total'])) {
    $total = $v['total'];
    break;
  }
}

Another approach (less optimal, but may look elegant to some people):

$key = array_search($packid, array_column($arr, 'packid'));
if ($key !== false && isset($arr[$key]['total'])) {
  $total = $arr[$key]['total'];
}

where array_column builds an array from the packid values ( [1, 2] ) in the order that matches the order of subarrays in $arr ; array_search returns the index of the first occurrence of $packid in the array of packid values (and thus, the key of the subarray in $arr ). The rest of the code fetches the total .

I have added this example for completeness. Don't use it as it is suboptimal.

For better performance, here is a good implementation.

$array = array_combine(array_column($arr, 'packId'), array_column($arr, 'total'));
$total = $array[$memPack->packId];

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM