从现有数组中删除指定键并生成新数组

3
我希望能够从一个数组中选取一些键(不按顺序),并创建一个新的数组。
我一直在使用 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
                        )

                )

            )
)

我需要从这些键 api, class, version 创建一个新的数组。

你能给我们举个例子吗?有没有明确的标准来确定你要取哪些元素,哪些元素要留下? - Sampson
请发布一些具体的例子或代码片段,这将有助于我们提供有意义的解决方案。 - ccKep
你想从提到的数组中复制什么内容? - ccKep
5个回答

1

如果你只需要这三个键:

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

1
但是我需要从现有数组中剪切它们。 - Eli
$oldArray 是您现有的数组。$newArray 将仅包含这三个键和旧数组的内容。 - ccKep
1
我不知道是谁在投反对票并且没有为他们的投票辩护,但是他们投了正确的答案。所以我给你点赞。显然,这个答案比循环数组更好,因为它运行时间是恒定的,而不是O(n)。 - nickb
1
我没有给它点踩,但这个解决方案会让原始数组中的值保留下来。如果我没记错的话,楼主想把它们从原始数组中删除。 - Sampson
你可以随时用新的内容覆盖原始内容...(我知道你可能已经知道了,只是说一下而已) - ccKep
@ccKep 我认为原帖作者想要一些指引。 - Sampson

1

创建一个明确的键列表,您想从一个数组移动到另一个数组。循环遍历该列表,从一个数组中提取并添加到另一个数组中。然后从原始数组中删除旧副本:

// 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


0
$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)));

0

这似乎太简单了:

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

然后执行 var_dump( $new_array); 来查看它是否包含期望的输出。

0

array_slice()函数,它可以让你“切片”出数组的一部分。这部分可以是单个元素,也可以是一系列元素。基本上,切片函数让你像substr()函数一样在数组上进行操作。


看起来很接近我想要的,只是我不理解如何使用array_splice的逻辑。 - Eli

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接