2013-05-15 142 views
1

我已經研究過與此類似的主題,但並不完全是我想要做的。 我有一個像下面這樣的多維數組。php array刪除鍵並將值向上移動

[code] => BILL 
[assets] => Array 
    (
     [en] => Array 
      (
       [datatype] => My Assets 
       [data] => Array 
        (
         [Corporate Equity] => 41 
         [Global Equity] => 24 
         [Fixed Income – Government] => 22 
         [Fixed Income – Corporate] => 8.1 
         [Other] => 3.57 
        ) 

      ) 

    ) 

我想刪除第一個內部數組,但保留值。在數組中將它們向上移動一層,使其看起來像這樣。

[code] => BILL 
[assets] => Array 
    (

     [datatype] => My Assets 
     [data] => Array 
      (
       [Corporate Equity] => 41 
       [Global Equity] => 24 
       [Fixed Income – Government] => 22 
       [Fixed Income – Corporate] => 8.1 
       [Other] => 3.57 
      ) 


    ) 

這是陣列的剛開始的時候,也有在同一水平相同的密鑰[en]的其他實例。

我試過未設置,array_shift和其他人,但我需要保持[en]的內容,只是將它們上移到數組中的一個級別。

+4

_there是相同的密鑰[CN]你將如何處理與其他實例相同level_的其他實例?如果你將它們全部轉移,你不會覆蓋每個以前的實例嗎? –

回答

4

可以使用array_map,該函數在應用函數後返回包含前一個數組的所有元素的數組。

在這種情況下,它只需要索引en的數組,並將其內容添加到新數組。

http://php.net/manual/en/function.array-map.php

$arr = array('assets' => array(
    'en' => array(
     'datatype' => 'My Assets', 
     'data' => array(
      'Corporate Equity' => 41, 
      'Global Equity' => 24, 
      'Fixed Income – Government' => 22, 
      'Fixed Income – Corporate' => 8.1, 
      'Other' => 3.57 
     ) 
    ) 
)); 

$new_arr = array_map(function ($e) { 
    return $e['en']; 
}, $arr); 
+0

謝謝,這個工程。 。 。但是我還沒有完全描述陣列。我已經編輯了我的原始數組,因爲您可以看到在頂層有一對[code] => BILL,在應用array_map過濾器後,結果爲[code] => B。爲什麼array_map會影響該值? – jimlongo

0

,它假定關鍵一個簡單的解決方案,始終en和子項永遠是(只)datatypedata

$assets['datatype'] = $assets['en']['datatype']; 
$assets['data'] = $assets['en']['data']; 
unset($assets['en']); 

此代碼可能是你有問題,將來如果這個數組結構不斷更改(它缺乏可擴展性),但它會根據您提供的信息得到您想要的結果。

0

我使用讀取器讀取XML文件後面臨同樣的情況下,返回的數組中具有插入0鍵陣列中的每個電平像以下各項之一:


'config' => 
      0 => 
       'products' => 
          0 => 
           'media' => 
           . 
           . 
           . 

所以我建立了一個小的功能擺脫一個特定的鑰匙,並將其孩子的二維陣列,在我的情況下,關鍵是0.跳躍這將有助於某人。


public function clearMaps(&$maps, $readerMaps, $omittedKey) 
{ 
    if (is_array($readerMaps)) { 
     foreach ($readerMaps as $key => $map) { 

      if ($key !== $omittedKey) { 

       $maps[$key] = []; 
       $this->clearMaps($maps[$key], $readerMaps[$key], $omittedKey); 
      } else { 

       $this->clearMaps($maps, $readerMaps[$key], $omittedKey); 
      } 
     } 
    } else { 

     $maps = $readerMaps; 
    } 
} 

// $maps: cleaned array, will start as empty array 
// $readerMaps: array needs to be cleaned 
// $omittedKey: array key to git rid of. 
// first call is clearMaps([], $readerMaps, 0);