2010-06-10 91 views
2

我在PHP中的數組爲以下查詢到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次?我會想,因爲數組在內存中,這將是找到我需要的值的最快方法。

另外,有沒有更好的方式來從頭開始查詢數據庫,以便我的結果集格式化的方式更容易搜索?

+0

事實上,'的mysql_query()'會返回一個MySQL ** **的資源,而不是一個數組。您必須使用MySQL函數(例如'mysql_fetch_array')來完成結果。 – animuson 2010-06-10 17:58:59

+0

你自己創建結果數組還是隻從Wordpress函數中獲取結果數組? – 2010-06-10 18:00:18

+0

我正在使用PHP PDO進行查詢,以便我可以使用參數。我不確定底層代碼是什麼樣的,但是調用pdo-> fetchAll()會返回一個多維數組,它在數字和關聯上都會被索引。 – 2010-06-10 21:21:18

回答

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) 

而且你可以很容易地通過使用索引獲得「meta_value」:

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

是你想擁有什麼?

編輯:如果您每個「meta_key」的值超過一個值,您也可以爲每個鍵創建一個多維數組。只需使用while循環,而不是在該行:

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

你不是讓每「meta_value」每行一個數組,以便您的陣列可能是這樣的:

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

然後,您可以使用其他循環以從一組「meta_key」值中獲取所有值。

+0

另外凱爾,你正確的說,搜索數組10次可能比10次mysql查詢更快。但它可能沒有你想象的那麼大。 – Nathan 2010-06-10 18:14:45

+0

從我的測試中,使用'mysql_fetch_assoc'循環完全沒有問題。但是,在循環中運行查詢的速度相當慢。 – 2010-06-10 18:20:59

0

根據您所提供的陣列上,執行以下操作:

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