क्या [] के साथ मान जोड़ने से पहले PHP सरणी घोषित करना आवश्यक है?


85
$arr = array(); // is this line needed?
$arr[] = 5;

मुझे पता है कि यह पहली पंक्ति के बिना काम करता है, लेकिन यह अक्सर अभ्यास में शामिल होता है।

क्या कारण है? क्या इसके बिना असुरक्षित है?

मुझे पता है आप भी ऐसा कर सकते हैं:

 $arr = array(5);

लेकिन मैं उन मामलों के बारे में बात कर रहा हूं जहां आपको एक-एक करके आइटम जोड़ने की जरूरत है।


2
जब तक आप अघोषित चर के बारे में नोटिस पसंद नहीं करते हैं, मैं शुरू करने की सलाह दूंगा। इसके अलावा, यह सिर्फ सुपाठ्य कोड के लिए बनाता है (यह स्पष्ट है कि $foo = array()और यह एक सरणी में बदल गया स्ट्रिंग नहीं था, आदि)।
ब्रैड क्रिस्टी 16

6
@ ब्रैड क्रिस्टी: सिवाय इसके कि इस तरह के नोटिस को ट्रिगर न करें।
BoltClock

जवाबों:


92

यदि आप एक नया सरणी घोषित नहीं करते हैं, और सरणी बनाने / अपडेट करने वाला डेटा किसी भी कारण से विफल हो जाता है, तो कोई भी भविष्य कोड जो सरणी का उपयोग करने की कोशिश करता है E_FATALक्योंकि सरणी मौजूद नहीं है।

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


अपदस्थ क्योंकि foreachउदाहरण और तथ्य यह है कि एक त्रुटि को ट्रिगर किया जा रहा है जाहिरा तौर पर PHP के संस्करण पर निर्भर करता है जिसे आप चला रहे हैं।
चार्ल्स स्प्रेबेरी

1
मैं उस जवाब को नहीं समझता। घोषित नहीं किया गया है और कुछ नहीं जोड़ा गया है जिसका मतलब है कि मैंने सोर्सकोड में नहीं लिखा है।
गॉर्डन

2
@ गोर्डन, कुछ का उदाहरण जो सही काम नहीं करेगा यदि $ कुछ 1 के बराबर नहीं है: यदि ($ कुछ == 1) {$ पंक्तियों [] = "a"; $ पंक्तियों [] = "बी"; } foreach ($ पंक्तियों के रूप में $ पंक्ति) {} त्रुटि से बचा जा सकता था $ पंक्तियों को $ पंक्तियों के रूप में घोषित किया गया था = सरणी (); इससे पहले कि अगर बयान हुआ।
djdy

1
मैं सहमत हूं (मैंने मतदान किया) लेकिन जीवन हर समय, हर समय घोषित करने के लिए बहुत छोटा है, भले ही हम जानते हैं कि यह "सही" करने के लिए बात है। यदि आप अघोषित सरणियों के बारे में चिंतित हैं तो वैकल्पिक रूप से, मैं अनुमान लगा रहा हूं कि आप is_array () का उपयोग कर सकते हैं। ज्यादातर चीजों की तरह, विशेष पर निर्भर करता है।
पीजे ब्रुनेट

25

बस यह बताना चाहता था कि PHP प्रलेखन मेंarrays वास्तव में इस बारे में बात करता है।

कोड स्निपेट के साथ PHP साइट से:

$arr[key] = value;
$arr[] = value;
// key may be an integer or string
// value may be any value of any type

"अगर $arrयह अभी तक मौजूद नहीं है, तो इसे बनाया जाएगा, इसलिए यह एक ऐरे बनाने का एक वैकल्पिक तरीका भी है।"

लेकिन, जैसा कि अन्य उत्तर में कहा गया है ... आपको वास्तव में अपने चर के लिए एक मूल्य घोषित करना चाहिए क्योंकि यदि आप नहीं करते हैं तो सभी प्रकार की बुरी चीजें हो सकती हैं।


14

Php एक शिथिल टाइप की भाषा है। यह पूरी तरह से स्वीकार्य है। यह कहा जा रहा है, असली प्रोग्रामर हमेशा अपने संस्करण घोषित करते हैं।


1
@Gordon वास्तव में मैं क्या सोच रहा था;)
AlienWebguy

क्षमा करें, लेकिन "वास्तविक" प्रोग्राम इस तरह से कोड करते हैं कि उन्हें 99% समय के लिए vars घोषित करने की आवश्यकता नहीं होती है। और आमतौर पर एक ऑब्जेक्ट का उपयोग करें जो संभावित खाली डेटा को संभालता है जैसे कि अशक्त
जेम्स

मजेदार कहानी है भाई।
एलियनवेबगुई

7

आपके बाद आने वाले कोडर्स के बारे में सोचो! यदि आप अभी देखते हैं $arr[] = 5, तो आपको पता नहीं है कि $arrदायरे में सभी पूर्ववर्ती कोड को पढ़े बिना क्या हो सकता है। स्पष्ट $arr = array()रेखा इसे स्पष्ट करती है।


2
PHP में 5.4.x - 5.6.x: $ arr = [] काम करता है, भी।
एंथनी रटलेज

4

यह सिर्फ अच्छा अभ्यास है। मान लें कि आप एक लूप (काफी सामान्य प्रैक्टिस) के अंदर अपने ऐरे से जुड़ रहे थे, लेकिन फिर उक्त लूप के बाहर ऐरे को एक्सेस कर रहे थे। एक सरणी घोषणा के बिना, आपका कोड त्रुटियों को फेंक देगा यदि आपने इसे लूप में कभी नहीं बनाया।


3

मैं मान जोड़ने से पहले सरणी को घोषित करने की दृढ़ता से सलाह देता हूं। ऊपर वर्णित सब कुछ के अलावा, यदि सरणी एक लूप के अंदर है तो आप अनजाने में अपने सरणी में तत्वों को धक्का दे सकते हैं। मैं सिर्फ यह एक महंगा बग बनाने मनाया।

//Example code    
foreach ($mailboxes as $mailbox){
       //loop creating email list to get
       foreach ($emails as $email){
          $arr[] = $email;
       }
       //loop to get emails
       foreach ($arr as $email){
       //oops now we're getting other peoples emails
       //in other mailboxes because we didn't initialize the array
       }
}

क्या मत करो ??
21

1

उपयोग करने से पहले किसी ऐरे की घोषणा नहीं करने से यह वास्तव में समस्या पैदा कर सकता है। एक अनुभव जो मैंने अभी पाया, मैंने इस टेस्ट स्क्रिप्ट को इस तरह कहा: indextest.php? File = 1STLSPGTGUS यह उम्मीद के मुताबिक काम करती है।

//indextest.php?file=1STLSPGTGUS
$path['templates']     = './mytemplates/';
$file['template']      = 'myindex.tpl.php';
$file['otherthing']      = 'otherthing';
$file['iamempty']    = '';

print ("path['templates'] = " . $path['templates'] . "<br>");
print ("file['template'] = " . $file['template'] . "<br>");
print ("file['otherthing'] = " . $file['otherthing'] . "<br>");
print ("file['iamempty'] = " . $file['iamempty'] . "<br>");

print ("file['file'] = " . $file['file'] . "<br>");// should give: "Notice: Undefined index: file"
print ("file = " . $file);// should give: "Notice: Undefined index: file"

//the Output is:
/*
path['templates'] = ./mytemplates/
file['template'] = myindex.tpl.php
file['otherthing'] = otherthing
file['iamempty'] =

Notice: Undefined index: file in D:\Server\Apache24\htdocs\DeliverText\indextest.php on line 14
file['file'] =

Notice: Array to string conversion in D:\Server\Apache24\htdocs\DeliverText\indextest.php on line 15
file = Array
*/

अब मुझे बस एक फाइल की आवश्यकता होगी, जो मैंने खरीदी एक अन्य स्क्रिप्ट से, मेरे शीर्ष पर और हम देख सकते हैं कि सरणी $ फ़ाइल के लिए मान पूरी तरह से गलत कैसे हैं जबकि सरणी $ पथ ठीक है: "चेकग्रुप.फैप" दोषी है।

//indextest.php?file=1STLSPGTGUS
require_once($_SERVER['DOCUMENT_ROOT']."/IniConfig.php");
$access = "PUBLIC";
require_once(CONFPATH . "include_secure/checkgroup.php");
$path['templates']     = './mytemplates/';
$file['template']      = 'myindex.tpl.php';
$file['otherthing']      = 'otherthing.php';
$file['iamempty']    = '';

print ("path['templates'] = " . $path['templates'] . "<br>");
print ("file['template'] = " . $file['template'] . "<br>");
print ("file['otherthing'] = " . $file['otherthing'] . "<br>");
print ("file['iamempty'] = " . $file['iamempty'] . "<br>");

print ("file['file'] = " . $file['file'] . "<br>");
print ("file = " . $file);

//the Output is:
/*
path['templates'] = ./mytemplates/
file['template'] = o
file['otherthing'] = o
file['iamempty'] = o
file['file'] = o
file = oSTLSPGTGUS
*/

पहले सरणी शुरू करना, फिर कोई समस्या नहीं!

//indextest.php?file=1STLSPGTGUS
require_once($_SERVER['DOCUMENT_ROOT']."/IniConfig.php");
$access = "PUBLIC";
require_once(CONFPATH . "include_secure/checkgroup.php");

$path = array();
$file = array();

$path['templates']     = './mytemplates/';
$file['template']      = 'myindex.tpl.php';
$file['otherthing']      = 'otherthing.php';
$file['iamempty']    = '';

print ("path['templates'] = " . $path['templates'] . "<br>");
print ("file['template'] = " . $file['template'] . "<br>");
print ("file['otherthing'] = " . $file['otherthing'] . "<br>");
print ("file['iamempty'] = " . $file['iamempty'] . "<br>");

print ("file['file'] = " . $file['file'] . "<br>");
print ("file = " . $file);

//the Output is:
/*
path['templates'] = ./mytemplates/
file['template'] = myindex.tpl.php
file['otherthing'] = otherthing.php
file['iamempty'] =
file['file'] =
file = Array
*/

यही कारण है कि मुझे एहसास हुआ कि चर को शुरू करना कितना महत्वपूर्ण है क्योंकि हम कभी नहीं जानते कि हम बाद में किस समस्या का सामना कर सकते हैं, और बस समय बचाने के लिए हम अंत में और भी अधिक बर्बाद कर सकते हैं। मुझे उम्मीद है कि यह मेरे जैसे उन लोगों के लिए मददगार होगा जो पेशेवर नहीं हैं।


1

पुराना प्रश्न है, लेकिन मैं इसे साझा करता हूं क्योंकि यह एक उपयोग का मामला है जहां कोड सरल है अगर सरणियाँ घोषित नहीं की जाती हैं।

कहते हैं कि आपके पास उन वस्तुओं की एक सूची है जिन्हें आपको उनके गुणों में से एक पर अनुक्रमित करने की आवश्यकता है।

// $list is array of objects, all having $key property.
$index = [];
foreach ($list as $item)
    $index[$item->key][] = $item; // Dont care if $index[$item->key] already exists or not.

0

यह आपकी त्रुटि जाँच पर निर्भर करता है। यदि आपको सख्त रिपोर्टिंग में त्रुटि हुई है तो यह आपको एक सूचना देगा लेकिन फिर भी इसके बिना तकनीकी रूप से काम करना चाहिए।


0

यह एक अच्छा मामला है जब आपको इसकी आवश्यकता वैश्विक चर के रूप में होती है या अलग-अलग कार्यों में एक ही सरणी का पुन: उपयोग करना चाहते हैं


0

यह आपका कोड है

$var[]  = 2;
print_r($var)

ठीक काम करता है! जब तक कोई आपके आकर्षक कोड से पहले एक ही चर नाम घोषित नहीं करता

$var = 3; 

$var[]  = 2;
print_r($var)

चेतावनी: एक स्केलर मान को सरणी के रूप में उपयोग नहीं कर सकते

ऊप्स!

यह एक संभव (कभी-कभी अप्रत्याशित) मामला है, इसलिए हां $var = array()की जरूरत है

$var = 3;
$var = array();
$var[]  = 2;
print_r($var)

उत्पादन

Array
(
    [0] => 2
)

0

के लिए foreachछोरों आप डेटा के रहे अनिश्चित है, तो आप ऐसा कर सकते हैं, तो:

foreach($users ?? [] as $user) {
    // Do things with $user
}

यदि $usersसेट नहीं किया गया है (अशक्त coalesce करता है isset($users)) तो आपको खाली सरणी []मिलेगी और इस प्रकार PHP लूप नहीं करेगी क्योंकि लूप के लिए foreachकुछ भी नहीं है - कोई त्रुटि, चेतावनी या नोटिस नहीं।

मैं टिप्पणियों / उत्तरों में कुछ से असहमत हूं, मुझे नहीं लगता कि आपको किसी तरह के सुरक्षा जाल के रूप में, बस इसके लिए खाली सरणियों या प्रारंभिक चर घोषित करना चाहिए। इस तरह के दृष्टिकोण मेरी राय में खराब प्रोग्रामिंग है। जब यह आवश्यक हो तो स्पष्ट रूप से करें।

और ईमानदार होने के लिए, यदि आपको एक खाली सरणी को इनिशियलाइज़ करना है, तो विचार करें कि क्या कोड बेहतर संरचित हो सकता है, आप बाद में या जो भी हो, डेटा की जांच कैसे करें।

निम्न कोड व्यर्थ है, यह "मंशा" नहीं दिखाता है यह लोगों को भ्रमित कर सकता है कि यह क्यों प्रारंभिक है (सबसे अच्छा यह पढ़ने और प्रक्रिया के लिए सिर्फ कुछ व्यर्थ है):

$user = [];
$user['name'] = ['bob'];

दूसरी पंक्ति भी नई सारणी घोषित करती है और कभी भी विफल नहीं होगी।


-3

@Djdy से सहमत हूं, सिर्फ एक विकल्प जो मुझे पोस्ट करने में अच्छा लगेगा:

<?php

// Passed array is empty, so we'll never have $items variable available.
foreach (array() AS $item)
    $items[] = $item;

isset($items) OR $items = array(); // Declare $items variable if it doesn't exist

?>

1
इस सबका क्या मतलब है? सचमुच कुछ नहीं के बारे में बहुत कुछ लगता है।
बोल्टलोक

पूर्व-घोषित $ आइटम चर के बजाय आप एक लूप के अस्तित्व की जांच करेंगे, बस।
ओटार

array()खाली सरणी है, foreachकभी कुछ नहीं करेगा?
जेम्स
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.