2012-05-08 35 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