2012-02-15 27 views
2

我正在使用Cassandra並將一些字節表示法保存爲ID。一切工作正常,但數據(id)不適合輸出。將函數應用於每個陣列密鑰

$users = $db->get('1'); 
echo '<pre>'; 
print_r($users); 
die(); 

輸出

Array 
(
    [��� X��W��c_ ] => Array 
     (
      [id] => ��� X��W��c_  
      [name] => steve 
      [surname] => moss 
     ) 

    [�*B�X��y�~p��~] => Array 
     (
      [id] => �*B�X��y�~p��~ 
      [name] => john 
      [surname] => doe 
     ) 

) 

正如你所看到的ID都是一些奇怪的字符,這是因爲他們在數據庫字節表示。他們看起來像\xf5*B\xa0X\x00\x11\xe1\x99y\xbf~p\xbc\xd1~

在PHPCASSA有功能CassandraUtil::import();我可以傳遞這些字節,它將返回GUID。它工作正常,但我想我的數組自動從字節轉換爲GUID。

我發現的唯一選擇是遍歷數組中的每個項目併爲其分配新值。不知何故,我認爲這不是最好的方法。有沒有其他方法可以做到這一點?

TL; DR 有像上面這樣的字節的數組,需要對數組鍵和ID使用CassandraUtil::import();來獲得可讀的ID。什麼是最有效的方式。

回答

0

UPDATE

對不起,只看到頂級陣列的關鍵,我認爲你必須運行下面的功能,以及一個又一個:

function cassImportWalkRecur(&$item, $key) 
{ 
    if ($key == 'id') 
     $item = CassandraUtil::import(); 
} 

$array = array_walk_recursive($array, 'cassImportWalkRecur'); 

那應該把它應用到ID字段。如果您需要首先檢查數據,那麼可能有辦法檢測編碼,但我不知道如何執行此操作。


您應該能夠創建一個函數,並使用array_walk遍歷數組並更新密鑰。喜歡的東西:

function cassImportWalk($item, &$key) 
{ 
    $key = CassandraUtil::import(); 
} 

$array = array_walk($array, 'cassImportWalk'); 

未經測試(也可能需要改變CassandraUtil使用),但應該工作。

+0

是的,我試過了,但它不起作用,因爲不是所有的元素都像ID一樣。使用'嘗試'是否是一個好主意,所以它只會對他可以改變的元素這樣做? – sed 2012-02-15 18:32:56

+0

'array_walk',應該隻影響頂層數組。對於內部數組,我們可能必須執行不同的功能/採取不同的過程。要更新我的答案。 @Qmal,更新。 – 2012-02-15 18:35:46

+0

就嘗試而言,它是否會拋出異常?如果是,請繼續嘗試將其包裝起來,並在需要時捕捉/處理錯誤。 – 2012-02-15 18:42:18

0

除非我誤解了問題,這可以簡單地和乾淨地完成像這樣:

$users = $db->get('1'); 
$keys = array_keys($users); 
$readableKeys = array_map("CassandraUtil::import",$keys); 
foreach($users as $currentKey => $subArray) { 
    $readableKey = array_shift($readableKeys); 
    $subArray['id'] = $readableKey; 
    $users[$readableKey] = $subArray; 
    unset($users[$currentKey]); 
} 
0

array_flip()所有鍵和值,然後array_walk()和應用我的功能,做最後的array_flip()之前。

相關問題