如何在多维PHP数组中有效地定位键值对?

如何在多维PHP数组中有效地定位键值对?,php,mysql,wordpress,multidimensional-array,Php,Mysql,Wordpress,Multidimensional Array,通过以下对Wordpress数据库的查询,我在PHP中得到了一个数组: SELECT * FROM wp_postmeta WHERE post_id = :id 返回的多维数组如下所示: Array ( [0] => Array ( [meta_id] => 380 [post_id] => 72 [meta_key] => _edit_last [meta_value] => 1 ) $arr = array(); while($row = $m

通过以下对Wordpress数据库的查询,我在PHP中得到了一个数组:

SELECT * FROM wp_postmeta WHERE post_id = :id
返回的多维数组如下所示:

Array ( [0] => Array ( [meta_id] => 380 [post_id] => 72 [meta_key] => _edit_last       [meta_value] => 1 )
$arr = array();
while($row = $mysqli->fetch_assoc()){
    $arr[$row['meta_key']] = $row;
}
Array ( [_edit_last] => Array ( [meta_id] => 380, [post_id] => 72, [meta_key] => _edit_last, [meta_value] => 1 )
。。。等等

在该数组中查找特定键值对的最佳方法是什么

例如,如何定位
[meta\u key]
=event\u name的行,以便将同一行的
[meta\u value]
值提取到PHP变量中

我意识到我可以将其转换为许多单独的MySQL查询。是否有人对在一行中执行10次SQL查询而不是在数组中搜索10次的效率有看法?我认为,由于数组在内存中,这将是找到所需值的最快方法


或者,是否有更好的方法从一开始就查询数据库,以便以更易于搜索的方式格式化我的结果集?

假设您始终希望搜索“meta_key”列创建数组,您可以执行以下操作:

Array ( [0] => Array ( [meta_id] => 380 [post_id] => 72 [meta_key] => _edit_last       [meta_value] => 1 )
$arr = array();
while($row = $mysqli->fetch_assoc()){
    $arr[$row['meta_key']] = $row;
}
Array ( [_edit_last] => Array ( [meta_id] => 380, [post_id] => 72, [meta_key] => _edit_last, [meta_value] => 1 )
然后,您将有一个关联数组,其中“meta_key”的值作为主索引。但在这种情况下,“meta_键”必须是唯一的,否则会覆盖这些值

您的示例不应如下所示:

Array ( [0] => Array ( [meta_id] => 380 [post_id] => 72 [meta_key] => _edit_last       [meta_value] => 1 )
$arr = array();
while($row = $mysqli->fetch_assoc()){
    $arr[$row['meta_key']] = $row;
}
Array ( [_edit_last] => Array ( [meta_id] => 380, [post_id] => 72, [meta_key] => _edit_last, [meta_value] => 1 )
通过使用索引,您可以轻松获得“meta_值”:

$var = $arr['_edit_last']['meta_value'];
这就是你想要的吗

编辑:如果每个“meta_键”的值多于一个,则还可以为每个键创建多维数组。只需在while循环中使用这一行:

$arr[$row['meta_key']][] = $row;
每个“meta_值”的每一行将有一个数组,因此数组可能如下所示:

Array ( [_edit_last] => Array ( [0] => Array( [meta_id] => 380, [post_id] => 72, [meta_key] => _edit_last, [meta_value] => 1 ) )

然后,您可以使用另一个循环从一组“meta_key”值中获取所有值。

根据您提供的数组,执行以下操作:

$multiArray = Array ( [0] => Array ( ['meta_id'] => 380, ['post_id'] => 72, ['meta_key'] => _edit_last, ['meta_value'] => 1 );
$needleKey = 'meta_key';
$needle = 'event_name';

foreach ($multiArray as $key => $data) {
    if ($data[$needleKey] == $needle) {
        echo $key;
        break;
    }
}

实际上,
mysql\u query()
将返回一个mysql资源,而不是数组。您必须使用MySQL函数(例如
MySQL\u fetch\u array
)来获取结果。您是自己构建结果数组,还是从Wordpress函数获取结果数组?我使用PHP PDO进行查询,以便使用参数。我不确定底层代码是什么样子的,但是调用pdo->fetchAll()会返回一个多维数组,该数组既有数字索引,也有关联索引。另外,Kyle,搜索数组10次可能比搜索10次mysql查询更快,这一点您是对的。但这可能没有你想象的那么大区别。根据我的测试,使用
mysql\u fetch\u assoc
进行循环绝对没有问题。然而,在循环中运行查询相比之下相当慢。