我研究过类似的主题,但不是我想要做的。我有一个多维数组,如下所示。
[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]
的内容,只是将它们在数组中向上移动一个级别。
您可以使用array_map
,它在应用该函数后返回一个包含前一个数组所有元素的数组。
在本例中,它将简单地获取索引为en
的数组,并将其内容添加到新数组中。
$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);
假设键始终为en
,子键始终(仅)为datatype
和data
的简单解决方案:
$assets['datatype'] = $assets['en']['datatype'];
$assets['data'] = $assets['en']['data'];
unset( $assets['en'] );
如果数组结构将来发生变化(它缺乏可扩展性),这段代码可能会给您带来问题,但它可以根据您提供的信息得到您想要的。
array_shift
与array_pop
相反。用于堆栈/队列类结构中,用于移除第一个元素http://php.net/manual/en/function.array-shift.php
你要做的是使数组变平。但是如果您想保留前面提到的所有其他子数组,您可以查找array_merge
.
我在使用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);