2015-01-29 5 views
6

के अंदर किसी सरणी में मान जोड़ें, मैं foreach लूप के अंदर, फ्लाई पर एक सरणी संपादित करने का प्रयास कर रहा हूं। मैं मूल रूप से प्रत्येक कुंजी का विश्लेषण करता हूं, और यदि यह कुंजी उस मैच से मेल खाती है, तो मैं इस के तुरंत बाद सरणी में एक और प्रविष्टि जोड़ना चाहता हूं।फ़ोरैच लूप

अगर मैं इस कोड को ले,

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

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

2 समस्याओं मिल गया है,

  • पहले, उत्पादन की उम्मीद 10 20 30 21
  • दूसरे के बजाय 10 20 30 है, भले ही मैं का समाधान पहली समस्या, मेरा मान अभी भी को पर मेरे सरणी
के साथ जोड़ा जाएगा

मैं bar और baz के बीच प्रविष्टि कैसे जोड़ सकता हूं?

आपके विचारों के लिए धन्यवाद।

+1

ऐसा शायद इसलिए है क्योंकि आप एक नई सरणी नहीं बना रहे हैं, लेकिन मूल्य को स्टोर करने के लिए पुरानी सरणी का उपयोग करें। यही कारण है कि यह आपके सरणी के अंत में है। ऐसा करने के लिए जो आप करना चाहते हैं वह एक नया चर बनाने के लिए है 'चलिए' $ 'डेटा' कहें और अपने 'foreach' लूप के साथ वहां मान डालें। – Refilon

+0

आपको इसे प्राप्त करने के लिए दूसरी सरणी की आवश्यकता नहीं है। 'Foreach' के बजाय 'लूप' का उपयोग करें और सरणी की लंबाई के माध्यम से पुनरावृत्ति करें और लूप के इंडेक्स चर का उपयोग करके, जो भी आप अपनी सरणी में जोड़ना चाहते हैं उसे जोड़ें। – VSG24

उत्तर

9

Foreach होगा सरणी को जोड़ा गया है, जबकि पाश अंदर नए मूल्यों के माध्यम से लूप नहीं।

आप दो मौजूदा मूल्यों के बीच नया मान जोड़ना चाहते हैं, तो आप एक दूसरी सरणी इस्तेमाल कर सकते हैं:

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

इसके अलावा, foreach पाश पर चर्चा StackOverflow पर मेरी पसंदीदा प्रश्नों में से एक देखें: How does PHP 'foreach' actually work?

+0

@ डेनिस तो आपको इसे उत्तर के रूप में पोस्ट करना चाहिए – meagar

+0

अपनी टिप्पणी को ऊपर उठाया;) लेकिन जब मैंने जवाब लिखना शुरू किया तो वहां नहीं था। –

+0

मुझे पता है @ लार्सएबर्ट, मैं आपको हाहा दोष नहीं देता हूं। और मेगर, हाँ ऐसा कर सकता था .. लेकिन लार्स ने पहले ही ऐसा किया था। – Refilon

1

यह आप एक नई सरणी बनाने की जरूरत के लिए,

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

डेमो:
http://3v4l.org/N4XgB

+0

यह बार और बाज़ के बीच नया मान नहीं जोड़ देगा। –

+0

ओह मुझे याद आया। –

0

नीचे दिया गया समाधान एक ही सरणी का उपयोग करता है।

$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

यह अभी भी उसी लूप में नए मान को मुद्रित नहीं करता है। –

+0

निश्चित रूप से, नई प्रविष्टि को जोड़ा गया है।लेकिन दुर्भाग्य से 'foreach' लूप इसे एक्सेस नहीं करेगा। – zessx

1

आप मूल्य से पहले एम्पर्सेंड साइन का उपयोग कर सकते हैं।

//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; 
} 
संबंधित मुद्दे