2016-12-30 47 views
1

我有下面的代码示例:PHP多维数组的关键,并得到价值

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

$ ARR是在一个循环

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

和$ memPack对象是这样的:

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) 
    } 
    } 
} 

}

我怎样才能搜索等于$memPack->packId的密钥packId并获得匹配总数? (例如,如果packId =2并获得值20)

+0

你的意思是除了循环? – Rasclatt

+0

更新了问题,$ arr在循环 –

回答

1

为了获得更好的性能,这里有一个很好的实现。

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

我认为你正在寻找一个循环,根据你选择的packid找到结果。

<?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; 

?> 

请让我知道这是你在找什么。

1

只需迭代数组并检查子数组是否包含匹配的项目packidtotal。打破循环的第一场比赛:

$packid = 2; 

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

另一种方法(不太理想,但可能显得高雅一些人):

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

其中array_column建立从packid值([1, 2])在一个数组与$arr中的子阵列的顺序相匹配的顺序; array_search返回packid值数组中第一次出现$packid的索引(并因此返回$arr中子数组的键)。其余代码取回total

我已经添加了这个例子的完整性。不要使用它,因为它是不理想的。

+0

THX,但我想知道为什么第二种方法不太理想?可以看到一些统计数字吗? –

+1

@DoranWu,'array_column'从'$ arr'('O(n)')中的所有项目构建一个数组。然后'array_search',在最坏的情况下,迭代生成的数组中的所有项('O(n)')。因此,最坏的情况是“O(2n)”操作。第一种方法('foreach')在最坏的情况下在第一个匹配“O(n)”时打破循环。此外,使用'array_search'和'array_column'的代码可读性较差,甚至不太灵活 –