php数组删除键并将值移位

时间:2013-05-15 20:45:02

标签: php arrays multidimensional-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]的其他实例。

我尝试过unset,array_shift和其他人,但我需要保留[en]的内容,只需将它们向上移动一个级别。

4 个答案:

答案 0 :(得分:5)

您可以使用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);

答案 1 :(得分:0)

一个简单的解决方案,假设密钥始终为en,子密钥始终为({only})datatypedata

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

如果该数组结构发生变化(它缺乏可扩展性),此代码将来可能会出现问题,但鉴于您提供的信息,它可以为您提供所需的信息。

答案 2 :(得分:0)

array_shiftarray_pop相反。用于堆栈/队列结构中,用于删除第一个元素http://php.net/manual/en/function.array-shift.php

你想要做的是压扁阵列。但是如果你想保留你提到的所有其他子阵列,你可能会查找array_merge

答案 3 :(得分:0)

在使用reader读取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);