【问题标题】:Return a sub array with two specific key/value pairs返回具有两个特定键/值对的子数组
【发布时间】:2018-03-06 14:28:13
【问题描述】:

考虑从 API 返回的以下数组:

$arr = Array
    (
        [A] => 
        [C] => 
        [D] => 
        [EE] => Array
            (
                [0] => Array
                    (
                        [B] => 
                        [C] => 2.06
                        [O] => 
                        [P] => 0
                        [T] => 1
                    )

                [1] => Array
                    (
                        [B] => 
                        [C] => 2.56
                        [O] => 
                        [P] => 0
                        [T] => 2
                    )

                [2] => Array
                    (
                        [B] => 
                        [C] => 4.94
                        [O] => 
                        [P] => 0
                        [T] => 3
                    )

                [3] => Array
                    (
                        [B] => 
                        [C] => 1.42
                        [O] => 
                        [P] => 1
                        [T] => 9
                    )

                [4] => Array
                    (
                        [B] => 
                        [C] => 2.83
                        [O] => 
                        [P] => 1
                        [T] => 10
                    )

                [5] => Array
                    (
                        [B] => 
                        [C] => 2.13
                        [O] => 
                        [P] => 1.5
                        [T] => 9
                    )

                [6] => Array
                    (
                        [B] => 
                        [C] => 1.7
                        [O] => 
                        [P] => 1.5
                        [T] => 10
                    )
            )
    )

我想从 P 为 1.5 且 T 为 9 的子数组中获取 C 值。显然,如果我知道这将始终位于索引为 5 的子数组中,我可以这样做:

$arr['EE'][5]['C'];

但 5 并不总是该特定数组的索引。所以我正在寻找更多类似的东西:

$arr['EE'][...P is 1.5 and T is 9...]['C'];

这是在处理数千个这样的数组的循环中,因此性能绝对是一个考虑因素。换句话说,我不想做一堆嵌套循环来找到那个值——如果它存在的话,我正在寻找一个内置的 PHP 函数(或它们的组合)。

【问题讨论】:

  • 您将不得不遍历$arr['EE'] 并测试每个值是否$val['P']$val['T'] 等于您期望的值,无论哪种方式。无法直接访问,除非您以这种方式重新索引数组或构建二级索引来查找直接索引。
  • 这是我目前正在走的路线。你已经证实我的想法并不疯狂。

标签: php arrays


【解决方案1】:

你也可以使用array_reduce

$arr = array
(
    "A" => "",
    "C" => "",
    "D" => "",
    "EE" => array
        (
            "0" => array
                (
                    "B" => "",
                    "C" => 2.06,
                    "O" => "",
                    "P" => 0,
                    "T" => 1,
                ),

            "1" => array
                (
                    "B" => "",
                    "C" => 2.56,
                    "O" => "",
                    "P" => 0,
                    "T" => 2,
                ),

            "2" => array
                (
                    "B" => "",
                    "C" => 4.94,
                    "O" => "",
                    "P" => 0,
                    "T" => 3,
                ),

            "3" => array
                (
                    "B" => "",
                    "C" => 1.42,
                    "O" => "",
                    "P" => 1,
                    "T" => 9,
                ),

            "4" => array
                (
                    "B" => "",
                    "C" => 2.83,
                    "O" => "",
                    "P" => 1,
                    "T" => 10,
                ),

            "5" => array
                (
                    "B" => "",
                    "C" => 2.13,
                    "O" => "",
                    "P" => 1.5,
                    "T" => 9,
                ),

            "6" => array
                (
                    "B" => "",
                    "C" => 1.7,
                    "O" => "",
                    "P" => 1.5,
                    "T" => 10,
                ),
        )
);

$p = 1.5;
$t = 9;

$result = array_reduce( $arr["EE"], function( $c, $v ) use ($p,$t) {
    if ( $v["P"] == $p && $v["T"] == $t ) $c = $v["C"];     
    return $c;
}, "" );

echo $result;

这将导致:

2.13

其他选项:您可以使用array_filter

$p = 1.5;
$t = 9;

$result = array_filter( $arr["EE"], function( $v ) use ($p,$t) {
    return $v["P"] == $p && $v["T"] == $t;      
} );

$result = array_values( $result );

echo "<pre>";
print_r( $result );
echo "</pre>";

这将导致

Array
(
    [0] => Array
        (
            [B] => 
            [C] => 2.13
            [O] => 
            [P] => 1.5
            [T] => 9
        )

)

所以访问C$result[0]["C"]

文档:array_filter


或者为了性能,可以使用foreach循环

$p = 1.5;
$t = 9;

$result = "";
foreach( $arr["EE"] as $v ) {
    if ( $v["P"] == $p && $v["T"] == $t ) $result = $v["C"];
}

echo $result;

【讨论】:

  • 你认为这会比使用 deceze 每次循环 $arr['EE'] 并评估这些值的方法更快吗?
  • 如果你想要更快的性能,你可以使用经典的foreach。我添加了一个例子
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-05
  • 1970-01-01
  • 2020-09-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多