通过将密钥从现有阵列剪切到新阵列来创建新阵列


create new array by cutting key from an existing array over to the new array

我想拿一个数组并从中剪切一些键(不是按顺序),然后从中创建一个新数组。

我使用 array_shift() 函数来做到这一点,但到了需要跳过下一个键然后再次执行array_shift的地步。

我该如何从逻辑上解决这个问题?

我的阵列

Array
(
    [api] => Array
        (
            [0] => system
            [1] => assets
            [2] => theme
            [3] => resources
            [4] => api
            [5] => xml
            [6] => json
            [7] => jsonp
            [8] => request
        )
    [class] => Array
        (
            [name] => authentication
            [abbr] => auth
        )
    [directories] => Array
        (
            [application] => application
            [mvc] => Array
                (
                    [model] => model
                    [view] => view
                    [controller] => controller
                )
            [assets] => Array
                (
                    [folder] => assets
                    [css] => css
                    [img] => img
                    [js] => js
                )
            [config] => config
        )
    [smarty] => Array
        (
            [security] => on
            [delimiter] => Array
                (
                    [left] => {!
                    [right] => !}
                )
            [template] => Array
                (
                    [header] => header
                    [footer] => footer
                    [extension] => tpl
                )
        )
    [version] => Array
        (
            [component] => Array
                (
                    [0] => Array
                        (
                            [name] => CMS
                            [version] => 1.0
                        )
                    [1] => Array
                        (
                            [name] => TinyMCE jQuery Package
                            [version] => 3.5
                        )
                    [2] => Array
                        (
                            [name] => jQuery
                            [version] => 1.7.2
                        )
                )
            )
)

我需要从他们的键创建一个新数组:apiclassversion

创建要从一个数组移动到另一个数组的显式键列表。循环浏览该列表,从一个列表拉取并添加到另一个列表。然后从原始阵列中删除旧副本:

// Original Array, and empty Array
$array = array( 'api' => 1, 'class' => 2, 'fizz' => 3, 'buzz' => 4 );
$newAr = array();
// For each key we'd like to keep
foreach ( array( 'api', 'class' ) as $key ) {
  // (Re)move the value from the original array to our new array
  $newAr[$key] = $array[$key]; unset( $array[$key] );
}
// Show the contents of the new array
print_r( $newAr );

立即在线试用: http://codepad.org/7iYG4iVB

如果只是这 3 个键,您需要:

$newArray = array(
    "api" => $oldArray["api"],
    "class" => $oldArray["class"],
    "version" => $oldArray["version"]
);

有 array_slice() 可以让你"切片"数组的一部分。该部分可以是单个元素,也可以是一系列元素。基本上,slice 函数可以让你对数组进行砍击,就像 substr() 让你砍掉一个字符串一样。

这似乎太简单了:

$new_array = array( 
    'api' => $old_array['api'],
    'class' => $old_array['class'],
    'version' => $old_array['version']
);

然后执行var_dump( $new_array);以查看它是否包含所需的输出。

$keys = array(1, 5, 'foo');
$new = array();
foreach ($keys as $key) {
    $new[$key] = $old[$key];
    // or maybe just $new[] = $old[$key];
    unset($old[$key]);
}

有更短的方法可以做到这一点,但我认为你可以理解它是如何工作的。

编辑 - 这是一个更短的方法

$keys = array(1, 5);
$new = array_intersect_key($old, array_flip($keys)));
$old = array_diff_key($old, array_flip($keys)));