लूप एक तत्व को दो बार जोड़ता है - php, arrays, loops

संपादित करें


यहां तक ​​कि जब मैंने इसे नेस्टेड लूप का उपयोग नहीं किया थाडुप्लिकेट। आखिर में अद्यतन कुंजी को अद्यतन कुंजी कुंजी सेट करके एक गंदे फिक्स कर दिया, इसलिए कम से कम एक डुप्लिकेट ओवरराइट किया जाएगा ... मैं कसम खाता हूं कि यह डेटा नहीं था। अद्यतन आईडी मेरी प्राथमिक कुंजी है, इसलिए वहां नहीं है जिस तरह से डीबी में डुप्लिकेट है, मैं भी अपने डीबी को देख रहा हूं और वहां कोई डुप्लीकेट नहीं है।

वैसे भी, एक सुंदर समाधान नहीं, लेकिन मुझे लगता है कि यह हल हो गया है:

   foreach( $L_a_updates as $update ){
if( array_key_exists($update["eventId"], $L_a_events) ){
$L_a_events[ $update["eventId"] ]["updates"][ $update["updateId"] ] = $update;
}
}

हालांकि नीचे दिए गए उत्तर अच्छे हैं, और इस समय मेरी तुलना में अधिक सक्षम दिमाग से स्पष्ट रूप से। TGIF।

नीचे मूल प्रश्न


यह शुक्रवार दोपहर है, इसलिए यह शायद कुछ गूंगा है, लेकिन मैं इसे ठीक से काम करने के लिए नहीं मिल सकता।

मुझे दो सरणी मिल गई हैं, $L_a_events तथा $L_a_updates। प्रत्येक कार्यक्रम में 0 या अधिक अपडेट हो सकते हैं।मैं डीबी से घटनाएं लाता हूं, फिर मैं अपडेट लाता हूं, और फिर मैं उन्हें ईवेंट आईडी की तुलना करने के लिए लूप के माध्यम से चलाता हूं और उनके ईवेंट में अपडेट जोड़ता हूं। तो अंतिम संरचना कुछ ऐसा है:

 Array(
[0] => Array(
["eventId"] => 2,
["message"] => "Some message",
["updates"] => Array(
[0] => Array (
["updateId"] => 123,
["eventId"]  => 2,
["message"]  => "Some update message",
)
)
)
);

मैं यह लूप को प्राप्त करने के लिए चलाता हूं:

foreach( $L_a_events as $key => $event ){
foreach( $L_a_updates as $update ){
if($update["eventId"] == $event["eventId"]){
$L_a_events[$key]["updates"][] = $update;
}
}
}

क्या मेरे लूप के साथ कुछ गलत है ?! डेटाबेस से परिणामसेट कोई डुप्लिकेट दिखाता है। जब मैं लूप चलाता हूं तो मैं दोनों सरणी प्रिंट करता हूं, वे दोनों ठीक दिखते हैं।

यह केवल इस लूप के बाद है कि किसी कारण से एक इवेंट सरणी में दो बार एक अपडेट जोड़ा जाता है। साथ ही, यह हर अद्यतन के साथ ऐसा नहीं करता है।

तो लूप के बाद, उपर्युक्त सरणी के बजाय, मुझे यह मिलता है:

 Array(
[0] => Array(
["eventId"] => 2,
["message"] => "Some message",
["updates"] => Array(
[0] => Array (
["updateId"] => 123,
["eventId"]  => 2,
["message"]  => "Some update message",
),
[1] => Array (
["updateId"] => 123,
["eventId"]  => 2,
["message"]  => "Some update message",
)
)
)
);

उत्तर:

उत्तर № 1 के लिए 1

ऐसा करने के लिए आपको दो नेस्टेड फोरैच लूप की आवश्यकता नहीं है। आपको क्या करने की ज़रूरत है:

for each update:
if event with this update"s event id exists:
add update to the event"s array entry

सभी घटनाओं पर लूप करने की बिल्कुल आवश्यकता नहीं है। आपके पास पहले से एक सरणी है जिसमें उन सभी घटनाएं शामिल हैं। आपको बस इतना करना है कि आपका इवेंट सरणी ईवेंट की आईडी को कुंजी के रूप में उपयोग करे।

PHP में यह कुछ ऐसा दिखाई देगा:

foreach ($L_a_updates as $update) {
$key = $update["event_id"];
if (array_key_exists($key, $L_a_events)) {
$L_a_events[$key]["updates"][] = $update;
}
}

उत्तर № 2 के लिए 1

यह मेरे लिए बहुत अक्षम कोड प्रतीत होता है, हालांकि मैं नहीं देख सकता कि यह समस्या क्या है। यह अच्छा होगा अगर $ L_a_events की कुंजी eventId थी, तो आप जो अपडेट जोड़ना चाहते हैं, उससे आप प्रारंभ कर सकते हैं:

foreach ($L_a_updates as $update) {
$eventId = $update["eventId"];
$L_a_events[$eventId]["updates"][] = $update;
}

जो इतना आसान और तेज होगा। धारणा यह है कि यदि आपके पास इसके लिए कोई अपडेट है तो एक ईवेंट मौजूद है। आप इसे बनाने के लिए थोड़ा कोड भी लिख सकते हैं:

foreach ($L_a_events => $event)
{
$eventId = $event["eventId"];
$newEvents[$eventId] = $event;
}

और $ L_a_events के बजाय $ newEvents का उपयोग करें। अब आप नेस्टेड लूप नहीं हैं।


जवाब के लिए 0 № 3

आपका कोड कार्यात्मक है। यह पिछले उत्तरों के अनुसार वैसे भी इष्टतम नहीं है। अपना डेटा जांचें।

<?php

$L_a_events = array(0=>array("eventId"=>1),1=>array("eventId"=>2));
$L_a_updates = array(0=>array("updateId"=>1,"eventId"=>1),1=>array("updateId"=>2,"eventId"=>1),2=>array("updateId"=>3,"eventId"=>2));

foreach( $L_a_events as $key => $event ){
foreach( $L_a_updates as $update ){
if($update["eventId"] == $event["eventId"]){
$L_a_events[$key]["updates"][] = $update;
}
}
}
print_r($L_a_events);

?>

आउटपुट:

Array
(
[0] => Array
(
[eventId] => 1
[updates] => Array
(
[0] => Array
(
[updateId] => 1
[eventId] => 1
)

[1] => Array
(
[updateId] => 2
[eventId] => 1
)

)

)

[1] => Array
(
[eventId] => 2
[updates] => Array
(
[0] => Array
(
[updateId] => 3
[eventId] => 2
)

)

)

)

संबंधित सवाल
सबसे लोकप्रिय