增值,在foreach循环现有阵列关键

问题描述:

我曾在一个数组(注意,表格中以随机顺序 - 还有其他领域也一样)以下书目数据:增值,在foreach循环现有阵列关键

Array 
(
    [0] => Array 
     (
      ['Pub_Name'] => Nature 
      ['Volume'] => 6 
      ['Pages'] => 215-217 
     ) 
    [1] => Array 
     (
      ['Volume'] => 15 
      ['Pages'] => 358-360 
      ['Pub_Name'] => Science    
     ) 
    [2] => Array 
     (
      ['Pub_Name'] => PNAS 
      ['Pages'] => 17-19    
      ['Volume'] => 22 
     ) 
)  

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

foreach ($MyArray as $Record) { 
    foreach ($Record as $key => $values) { 
     if ($key=="Volume") {$Volumen=", ".$values;} else {$Volumen="";} 
     if ($key=="Pages") {$Paginas=": ".$values;} else {$Paginas="";} 
    } 

    //This is the line for which I want to know the sintax!! 
    $Record['Pub_Name'].=$Volumen.$Paginas; 
} 
+0

结帐http://php.net/manual/en/function.array-values.php – mkaatman

无需两个循环:

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

然后,你必须在$resultPub_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']}"; 
} 
+0

它的工作,谢谢!请问,在第二种选择中'&'是什么? – CMArg

+0

这是修改'$ Record'时修改数组的引用。在这里解释:http://php.net/manual/en/control-structures.foreach.php – AbraCadaver

+0

谢谢。对你的链接取消“$ Record”的警告也帮助了我... – CMArg

PHP code demo

<?php 
$array=Array 
(
    0 => Array 
     (
      'Pub_Name' => "Nature", 
      'Volume' => 6, 
      'Pages' => "215-217" 
     ), 
    1 => Array 
     (
      'Volume' => 15, 
      'Pages' => "358-360", 
      'Pub_Name' => "Science"    
     ), 
    2 => Array 
     (
      'Pub_Name' => 'PNAS', 
      'Pages' => "17-19",   
      'Volume' => 22 
     ) 
); 
$result=array(); 
foreach ($array as $data) 
{ 
    $result[]=array('Pub_Name'=> $data['Pub_Name'].", ".$data["Volume"].": ".$data["Pages"]); 

} 
print_r($result); 

输出:

Array 
(
    [0] => Array 
     (
      [Pub_Name] => Nature, 6: 215-217 
     ) 

    [1] => Array 
     (
      [Pub_Name] => Science, 15: 358-360 
     ) 

    [2] => Array 
     (
      [Pub_Name] => PNAS, 22: 17-19 
     ) 

) 

我想这是你在找什么:

<?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); 

以上代码的输出显然是:

Array 
(
    [0] => Nature, 6: 215-217 
    [1] => Science, 15: 358-30 
    [2] => PNAS, 22: 17-19 
) 

这应有助于:

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

使用array_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']:''); 
} 

在一个循环清除的方式。用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); 
?> 

,你会得到:

array(3) { 
[0]=> string(18) "Nature, 6: 215-217" 
[1]=> string(19) "Science, 15: 358-30" 
[2]=> string(15) "PNAS, 22: 17-19" 
} 

测试它here

+1

非常感谢。很多答案在几分钟内(我一直坚持这个很长一段时间)。可悲的是,只能有一个被接受的答案。 – CMArg