foreach与多维数组,其中键匹配值

时间:2014-08-13 19:00:45

标签: php arrays

标题解释了这一切,我知道如何做到这一点,但我一直想知道是否有更短的方法这样做。

让我们说,

$mutli = array(
    array('name' => 'john', 'adult' => 'true'  ),
    array('name' => 'eric', 'adult' => 'true'  ),
    array('name' => 'ryan', 'adult' => 'false' )
);

有没有更好的方法来选择成人== true的所有较低数组?

$list = array();
foreach( $multi as $sub ){
    foreach( $sub as $key => $value ){
        if( $key == "adult" && $value == "true" )
            array_push( $list, $sub );
    }
}

不紧急,但我总是很好奇。

也许

while( $key => $value as each($mutli) )

或者其他:p

3 个答案:

答案 0 :(得分:4)

您可以使用array_filter

$filtered = array_filter($mutli, function($v) { return $v['adult'] == 'true'; });

答案 1 :(得分:2)

如果您知道钥匙,那么您就不需要第二次预告。

foreach($multi as $sub) {
    if(!empty($sub['adult']) AND $sub['adult'] == 'true') {
        array_push($list, $sub);
    }
}

编辑:我很好奇array_filter是否比循环更快。这就是我得到的:

结果:

array_filter rendering: 0.30101799964905
foreach rendering: 0.069003820419312

Testscript:

<?php
$mutli = array(
    array('name' => 'john', 'adult' => 'true'  ),
    array('name' => 'eric', 'adult' => 'true'  ),
    array('name' => 'ryan', 'adult' => 'false' )
);

$filtered = array();
$list = array();

$start = microtime(true);
for($i = 1; $i <= 10000; $i++) {
    $filtered = array_filter($mutli, function($v) { return $v['adult'] == true; });
}
echo "array_filter rendering: ".(microtime(true) - $start)."<br />";

$start = microtime(true);
for($i = 1; $i <= 10000; $i++) {
    foreach($mutli as $sub) {
        if(!empty($sub['adult']) AND $sub['adult'] == 'true') {
            array_push($list, $sub);
        }
    }
}
echo "foreach rendering: ".(microtime(true) - $start)."<br />";

答案 2 :(得分:0)

为了好玩,如果你有PHP&gt; = 5.5.0(array_column需要):

$result = array_intersect_key($multi,
                              array_keys(array_column($multi, 'adult'), 'true'));
  1. 使用array_column
  2. 获取“成人”列键和值
  3. 使用array_keys
  4. 返回值等于'true'的键和值
  5. 使用array_intersect
  6. 返回键与原始数组匹配的数组