Применить функцию к каждому ключу массива - PullRequest
2 голосов
/ 15 февраля 2012

Я использую 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
        )

)

Как видите, идентификаторы - это некоторые странные символы, потому что они представляют собой байтовые представления в базе данных. Они на самом деле выглядят как \xf5*B\xa0X\x00\x11\xe1\x99y\xbf~p\xbc\xd1~.

В PHPCASSA есть функция CassandraUtil::import();, в которую я могу передать эти байты, и она вернет guid. Он работает нормально, но я хочу, чтобы мой массив автоматически преобразовывался из байтов в направляющие.

Единственный вариант, который я нахожу, это циклически проходить по каждому элементу в массиве и присваивать ему новое значение. Почему-то я думаю, что это не лучший подход. Есть ли другие способы сделать это?

TL; DR Иметь массив с байтами, как указано выше, необходимо использовать CassandraUtil::import(); для ключей массива и идентификаторов, чтобы получить читаемые идентификаторы. Какой самый эффективный способ сделать это.

Ответы [ 3 ]

0 голосов
/ 15 февраля 2012

Если я не неправильно понял вопрос, это можно сделать просто и чисто так:

$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 голосов
/ 05 марта 2016

Будет array_flip() все ключи и значения, затем array_walk() и применить мою функцию, прежде чем делать окончательный array_flip().

0 голосов
/ 15 февраля 2012

ОБНОВЛЕНИЕ

Извините, видел только ключ массива верхнего уровня, я думаю, что вам придется запускать функцию ниже, а также другую после:

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

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

Это должно применить его к полям идентификатора.Если вам нужно сначала проверить данные, возможно, есть способ определить кодировку, но я не уверен, как это сделать.


Вы сможете создать функцию и использовать array_walk для обхода массива и обновления ключей.Что-то вроде:

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

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

Не проверено (также вам, возможно, придется изменить использование CassandraUtil), но должно работать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...