【问题标题】:How do I efficiently locate key-value pairs in a multi-dimensional PHP array?如何有效地定位多维 PHP 数组中的键值对?
【发布时间】:2011-03-02 07:35:48
【问题描述】:

由于以下对 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 )

...等等

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

例如,我如何定位 [meta_key] = event_name 所在的行,以便将同一行的 [meta_value] 值提取到 PHP 变量中?

我意识到我可以把它变成许多单独的 MySQL 查询。有没有人对连续执行 10 个 SQL 查询而不是搜索 10 次数组的效率有意见?我认为由于数组在内存中,这将是找到我需要的值的最快方法。

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

【问题讨论】:

  • 实际上,mysql_query() 将返回一个 MySQL Resource,而不是一个数组。您必须使用 MySQL 函数(例如mysql_fetch_array)来获取结果。
  • 您自己构建结果数组还是从 Wordpress 函数中获取结果数组?
  • 我正在使用 PHP PDO 进行查询,因此我可以使用参数。我不确定底层代码是什么样子的,但是对 pdo->fetchAll() 的调用会返回一个多维数组,该数组具有数字索引和关联索引。

标签: php mysql wordpress multidimensional-array


【解决方案1】:

假设您总是想搜索列“meta_key”来创建数组,您可以这样做:

$arr = array();
while($row = $mysqli->fetch_assoc()){
    $arr[$row['meta_key']] = $row;
}

然后您将拥有一个关联数组,其中“meta_key”的值作为主索引。但在这种情况下,“meta_key”必须是唯一的,否则您会覆盖这些值。

你的例子应该是这样的:

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

您可以通过使用索引轻松获取“元值”:

$var = $arr['_edit_last']['meta_value'];

这是你想要的吗?

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

$arr[$row['meta_key']][] = $row;

每个“元值”的每一行都会有一个数组,因此您的数组可能如下所示:

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

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

【讨论】:

  • 还有凯尔,你说得对,搜索数组 10 次可能比 10 次 mysql 查询快。但这可能并没有你想象的那么大。
  • 根据我的测试,循环使用mysql_fetch_assoc 绝对没有问题。然而,相比之下,在循环中运行查询相当慢。
【解决方案2】:

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

$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;
    }
}

【讨论】:

    猜你喜欢
    • 2021-05-28
    • 1970-01-01
    • 2013-09-21
    • 1970-01-01
    • 2019-04-15
    • 2019-09-11
    • 1970-01-01
    • 1970-01-01
    • 2014-12-12
    相关资源
    最近更新 更多