2012-05-08 32 views
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 
         ) 

       ) 

      ) 
) 

我需要从他们的密钥作出新的数组:apiclassversion

+0

你能不能给我们举个例子。是否有一个可定义的标准来确定你正在使用哪些元素,以及你要离开哪些元素? – Sampson

+0

发布您的代码的一些具体示例/部分,这将帮助我们提供有意义的解决方案。 – ccKep

+0

你想从所提到的数组中复制什么? – ccKep

回答

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

array_slice()它可以让你“片”出来的阵列的一部分。该部分可以是单个元素或一系列元素。基本上,切片功能可以让你对像substr()这样的数组进行切割,让你可以切割出一串字符串。

+0

似乎接近我想要的,我只是不明白如何去使用'array_splice'逻辑如何使用' – Eli

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))); 
1

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

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

但我需要从现有的数组中删除 – Eli

+0

'$ oldArray'将是你现有的数组。 '$ newArray'将只包含这3个键和旧数组的内容。 – ccKep

+1

Downvoted?谨慎解释? – ccKep

0

这似乎太简单了:

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

然后做一个var_dump($new_array);到看看它是否包含所需的输出。

+0

@Downvoter - 有何评论? – nickb

+0

它上升到11! – ccKep