将函数应用于每个数组键

时间:2012-02-15 18:23:23

标签: php arrays cassandra

我正在使用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。它工作正常,但我希望我的数组自动从字节转换为guids。

我找到的唯一选项是循环遍历数组中的每个项目并为其分配新值。不知怎的,我认为这不是最好的方法。还有其他方法吗?

TL; DR 有像上面这样的字节的数组,需要在数组键和id上使用CassandraUtil::import();来获取可读的id。这样做最有效的方法是什么。

3 个答案:

答案 0 :(得分:0)

<强>更新

抱歉,只看到了顶级数组键,我认为你必须运行下面的函数以及另一个函数:

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用法),但应该工作。

答案 1 :(得分: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]);
}

答案 2 :(得分:0)

在做最终array_flip()之前,array_walk()array_flip()所有键和值,然后<?xml version="1.0" encoding="utf-8"?> <android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:fitsSystemWindows="true" tools:context="com.example.sayan.kennel.MainActivity"> <android.support.design.widget.AppBarLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:theme="@style/AppTheme.AppBarOverlay"> <android.support.v7.widget.Toolbar android:id="@+id/toolbar" android:layout_width="match_parent" android:layout_height="?attr/actionBarSize" android:background="?attr/colorPrimary" app:layout_scrollFlags="scroll|enterAlways"/> <android.support.design.widget.TabLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/tab"/> </android.support.design.widget.AppBarLayout> <android.support.v4.view.ViewPager android:layout_width="match_parent" android:layout_height="match_parent" app:layout_behavior="@string/appbar_scrolling_view_behavior" android:id="@+id/viewpager"/> <include layout="@layout/content_main" /> <android.support.design.widget.FloatingActionButton android:id="@+id/fab" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="bottom|end" android:layout_margin="@dimen/fab_margin" android:src="@android:drawable/ic_dialog_email" /> </android.support.design.widget.CoordinatorLayout> 并应用我的函数。