2015-01-29 19 views
6

Tôi đang cố chỉnh sửa một mảng khi đang di chuyển, bên trong vòng lặp foreach. Về cơ bản, tôi phân tích mỗi khóa và nếu khóa này khớp với khóa tôi muốn, tôi muốn thêm mục nhập khác trong mảng ngay sau số này.Thêm giá trị vào một mảng bên trong vòng lặp foreach

Nếu tôi đưa mã này,

$values = array(
    'foo' => 10, 
    'bar' => 20, 
    'baz' => 30 
); 

foreach($values as $key => $value){ 
    print $value . ' '; 
    if($key == 'bar'){ 
     $values['qux'] = 21; 
    } 
} 

Tôi đã có 2 vấn đề,

  • đầu tiên, đầu ra là 10 20 30 thay vì dự kiến ​​10 20 30 21
  • thứ hai, ngay cả khi tôi giải quyết vấn đề đầu tiên, giá trị của tôi sẽ vẫn được thêm vào cuối của mảng của tôi

Làm cách nào để thêm mục nhập qux giữa các số barbaz?

Cảm ơn ý tưởng của bạn.

+1

Có thể vì bạn không tạo mảng mới, nhưng sử dụng mảng cũ để lưu trữ giá trị. Đó là lý do tại sao nó ở cuối mảng của bạn. Để làm những gì bạn muốn làm là tạo một biến mới, giả sử '$ aData' và chèn các giá trị vào đó với vòng lặp' foreach' của bạn. – Refilon

+0

Bạn không cần một mảng thứ hai để đạt được điều này. Thay vì 'foreach' sử dụng vòng lặp' for' và lặp qua chiều dài của mảng và sử dụng biến chỉ mục của vòng lặp for, hãy thêm bất cứ thứ gì bạn muốn vào mảng của mình. – VSG24

Trả lời

9

Foreach sẽ không lặp qua các giá trị mới được thêm vào mảng trong khi bên trong vòng lặp.

Nếu bạn muốn thêm giá trị mới giữa hai giá trị hiện tại, bạn có thể sử dụng một mảng thứ hai:

$values = array(
    'foo' => 10, 
    'bar' => 20, 
    'baz' => 30 
); 
$newValues = array(); 
foreach($values as $key => $value) 
{ 
    $newValues[$key] = $value; 
    if($key == 'bar') 
    { 
     $newValues['qux'] = 21; 
    } 
} 
print implode(' ', $newValue); 

Ngoài ra, xem một trong những câu hỏi yêu thích của tôi trên StackOverflow thảo luận về vòng lặp foreach: How does PHP 'foreach' actually work?

+0

@ Dennis Sau đó, bạn nên đã đăng nó như là một câu trả lời thay vì – meagar

+0

Upvoted bình luận của bạn;) Nhưng nó đã không có khi tôi bắt đầu viết câu trả lời. –

+0

Tôi biết @LarsEbert, tôi không trách bạn haha. Và meagar, yea có thể làm điều đó .. nhưng Lars đã làm như vậy. – Refilon

1

Đối với điều này, bạn cần tạo một mảng mới,

<?php 
$values = array(
    'foo' => 10, 
    'bar' => 20, 
    'baz' => 30 
); 

$newarray = array(); 
foreach($values as $k => $v) 
{ 
    $newarray[$k] = $v; 
    if($k == 'bar') 
     $newarray['qux'] = 21; 
} 

echo implode(' ', $newarray); 

Demo:
http://3v4l.org/N4XgB

+0

Điều này sẽ không thêm giá trị mới giữa thanh và baz. –

+0

Oh tôi đã bỏ lỡ điều đó. –

0

Giải pháp dưới đây sử dụng cùng một mảng.

$values = array(
    'foo' => 10, 
    'bar' => 20, 
    'baz' => 30 
); 

function match($niddle, $haystack, $push, $offset = 0) { 
    foreach(array_slice($haystack, $offset) as $key => $value) 
    { 
     print $value . ' '; 
     if($key == $niddle) 
     { 
      $i = array_search($niddle, array_keys($haystack)) + 1; 
      $haystack = array_slice($haystack, 0, $i, true) + $push + array_slice($haystack, $i, count($haystack) - $i, true); 
      $haystack = match($niddle, $haystack, $push, $i); 
      break; 
     } 
    } 

    return $haystack; 
} 

$values = match('bar', $values, array('qux'=>21)); 

var_dump($values); 
+0

Nó vẫn không in giá trị mới trong cùng một vòng lặp. –

+0

Chắc chắn, mục mới được thêm vào.Nhưng tiếc là vòng lặp 'foreach' sẽ không truy cập nó. – zessx

1

Bạn có thể sử dụng dấu và trước giá trị.

//populate all the promos into their promoG groups 
foreach($unclaimedPromoGroups as &$unclaimedPromoGroup) { 
    $_promo = new Promo(); 
    $_promo->promoGroupID = $unclaimedPromoGroup['promo_groupID']; 
    $promo = $_promo->getGroupPromos(); 
    $unclaimedPromoGroup["promos"] = $promo; 
} 
Các vấn đề liên quan