Php 向foreach循环中的现有数组键添加值

Php 向foreach循环中的现有数组键添加值,php,arrays,Php,Arrays,我在一个数组中有以下书目数据(请注意,字段是按随机顺序排列的,还有其他字段): 我想将这三个字段“合并”为一个,例如['Pub_Name']=Nature,6:215-217。我尝试了以下whitout成功(我猜$Record['Pub\u Name']是不正确的sintax): 不需要两个循环: foreach ($MyArray as $Record) { $result[]['Pub_Name'] = "{$Record['Pub_Name']}, {$Record['Pages'

我在一个数组中有以下书目数据(请注意,字段是按随机顺序排列的,还有其他字段):

我想将这三个字段“合并”为一个,例如
['Pub_Name']=Nature,6:215-217
。我尝试了以下whitout成功(我猜
$Record['Pub\u Name']
是不正确的sintax):

不需要两个循环:

foreach ($MyArray as $Record) {
    $result[]['Pub_Name'] = "{$Record['Pub_Name']}, {$Record['Pages']}: {$Record['Volume']}";
}
然后在
$result
中有新的
Pub_Name
条目

如果要修改原始记录,请参考
&
$Record

foreach ($MyArray as &$Record) {
    $Record['Pub_Name'] = "{$Record['Pub_Name']}, {$Record['Pages']}: {$Record['Volume']}";
}
或者使用该键并修改原始数组:

foreach ($MyArray as $key => $Record) {
    $MyArray[$key]['Pub_Name'] = "{$Record['Pub_Name']}, {$Record['Pages']}: {$Record['Volume']}";
}
不需要两个循环:

foreach ($MyArray as $Record) {
    $result[]['Pub_Name'] = "{$Record['Pub_Name']}, {$Record['Pages']}: {$Record['Volume']}";
}
然后在
$result
中有新的
Pub_Name
条目

如果要修改原始记录,请参考
&
$Record

foreach ($MyArray as &$Record) {
    $Record['Pub_Name'] = "{$Record['Pub_Name']}, {$Record['Pages']}: {$Record['Volume']}";
}
或者使用该键并修改原始数组:

foreach ($MyArray as $key => $Record) {
    $MyArray[$key]['Pub_Name'] = "{$Record['Pub_Name']}, {$Record['Pages']}: {$Record['Volume']}";
}


我想这就是你想要的:

<?php
$input = [
    [
        'Pub_Name' => 'Nature',
        'Volume' => '6',
        'Pages' => '215-217'
    ],
    [
        'Volume' => '15',
        'Pages' => '358-30',
        'Pub_Name' => 'Science',
    ],
    [
        'Pub_Name' => 'PNAS',
        'Pages' => '17-19',
        'Volume' => '22'
    ]
];
$output = [];
array_walk($input, function ($entry) use (&$output) {
    $output[] = sprintf(
        '%s, %s: %s',
        $entry['Pub_Name'],
        $entry['Volume'],
        $entry['Pages']
    );
});
print_r($output);

我想这就是你想要的:

<?php
$input = [
    [
        'Pub_Name' => 'Nature',
        'Volume' => '6',
        'Pages' => '215-217'
    ],
    [
        'Volume' => '15',
        'Pages' => '358-30',
        'Pub_Name' => 'Science',
    ],
    [
        'Pub_Name' => 'PNAS',
        'Pages' => '17-19',
        'Volume' => '22'
    ]
];
$output = [];
array_walk($input, function ($entry) use (&$output) {
    $output[] = sprintf(
        '%s, %s: %s',
        $entry['Pub_Name'],
        $entry['Volume'],
        $entry['Pages']
    );
});
print_r($output);
这将有助于:

$combined = [];
foreach($myArray as $pub) {
    $combined.push($pub['Pub_Name'] . ', ' . $pub['Volume'] . ': ' . $pub['Pages']);
}
这将有助于:

$combined = [];
foreach($myArray as $pub) {
    $combined.push($pub['Pub_Name'] . ', ' . $pub['Volume'] . ': ' . $pub['Pages']);
}

使用
array\u map

$in = [
    0 => [
        'Pub_Name' => 'Nature',
        'Volume' => 6,
        'Pages' => '215-217'
    ],
    1 => [
        'Volume' => 15,
        'Pages' => '358-360',
        'Pub_Name' => 'Science',
    ],
    2 => [
        'Pub_Name' => 'PNAS',
        'Pages' => '17-19',
        'Volume' => 22
    ]
];

array_map(function ($item) {
    return $item['Pub_Name'] . ', ' . $item['Volume'] . ': ' . $item['Pages'];
}, $in);

使用
array\u map

$in = [
    0 => [
        'Pub_Name' => 'Nature',
        'Volume' => 6,
        'Pages' => '215-217'
    ],
    1 => [
        'Volume' => 15,
        'Pages' => '358-360',
        'Pub_Name' => 'Science',
    ],
    2 => [
        'Pub_Name' => 'PNAS',
        'Pages' => '17-19',
        'Volume' => 22
    ]
];

array_map(function ($item) {
    return $item['Pub_Name'] . ', ' . $item['Volume'] . ': ' . $item['Pages'];
}, $in);

有几种不同的方法可以做到这一点,但其中一种更具可读性的方法是:

// create a copy of the original - so we aren't looping thru the same array we're updating
$updatedArray = $MyArray;

foreach ($MyArray as $index => $record) {
    $updatedArray[$index]['Pub_Name'] =
        $record['Pub_Name'].  
        ($record['Volume'] ? ', '.$record['Volume'] : ''). 
        ($record['Pages'] ? ': '.$record['Pages']:'');
}

有几种不同的方法可以做到这一点,但其中一种更具可读性的方法是:

// create a copy of the original - so we aren't looping thru the same array we're updating
$updatedArray = $MyArray;

foreach ($MyArray as $index => $record) {
    $updatedArray[$index]['Pub_Name'] =
        $record['Pub_Name'].  
        ($record['Volume'] ? ', '.$record['Volume'] : ''). 
        ($record['Pages'] ? ': '.$record['Pages']:'');
}

在一个循环中清除路径。使用sprintf()可轻松设置格式:

<?php
$src =[ ['Pub_Name' => 'Nature', 'Volume' => '6', 'Pages' => '215-217'],
        ['Volume' => '15', 'Pages' => '358-30', 'Pub_Name' => 'Science'],
        ['Pub_Name' => 'PNAS', 'Pages' => '17-19',  'Volume' => '22']
      ];

foreach ($src as $element) {
    $dest[] = sprintf("%s, %d: %s", 
       $element['Pub_Name'], 
       $element['Volume'], 
       $element['Pages']);
}

var_dump($dest);
?>

测试一下

在单个循环中清除路径。使用sprintf()可轻松设置格式:

<?php
$src =[ ['Pub_Name' => 'Nature', 'Volume' => '6', 'Pages' => '215-217'],
        ['Volume' => '15', 'Pages' => '358-30', 'Pub_Name' => 'Science'],
        ['Pub_Name' => 'PNAS', 'Pages' => '17-19',  'Volume' => '22']
      ];

foreach ($src as $element) {
    $dest[] = sprintf("%s, %d: %s", 
       $element['Pub_Name'], 
       $element['Volume'], 
       $element['Pages']);
}

var_dump($dest);
?>

测试一下

检查检查工作是否正常,谢谢!请注意,
&
在您的第二个选项中说明了什么?它是一个在您修改
$Record
时修改数组的引用。这里解释:谢谢。关于取消设置链接的
$Record
的警告也帮助了我…成功了,谢谢!请注意,
&
在您的第二个选项中说明了什么?它是一个在您修改
$Record
时修改数组的引用。这里解释:谢谢。关于取消设置链接的
$Record
的警告也帮助了我…非常感谢。几分钟内就有这么多答案(我已经被这个问题困扰了很长时间)。遗憾的是,只有一个被接受的答案。非常感谢。几分钟内就有这么多答案(我已经被这个问题困扰了很长时间)。遗憾的是,只有一个被接受的答案。