मैं दो आयामी सरणी कैसे घोषित करूं?


91

2d सरणी बनाने का सबसे आसान तरीका क्या है। मैं इसके समान कुछ करने में सक्षम होने की उम्मीद कर रहा था:

declare int d[0..m, 0..n]

जवाबों:


81

आप सरणी के सूचकांक को निर्दिष्ट करके, सरणी की तरह एक साहचर्य सरणी, या "हैश-टेबल" भी बना सकते हैं।

$array = array(
    0 => array(
        'name' => 'John Doe',
        'email' => 'john@example.com'
    ),
    1 => array(
        'name' => 'Jane Doe',
        'email' => 'jane@example.com'
    ),
);

के बराबर है

$array = array();

$array[0] = array();
$array[0]['name'] = 'John Doe';
$array[0]['email'] = 'john@example.com';

$array[1] = array();
$array[1]['name'] = 'Jane Doe';
$array[1]['email'] = 'jane@example.com';

1
हम लूपिंग स्टेटमेंट्स का उपयोग करके इसे कैसे बना सकते हैं?
अनूप पीट

@ अनूप-पीट दूसरे स्निपेट में दो रिपीटिंग ब्लॉक को लूप में रखा जाएगा और न्यूमेरिक इंडेक्स को एक वेरिएबल से रिप्लेस किया जाएगा जो प्रत्येक इटरेनेशन को बढ़ाता है।
एटली

1
@AnoopPete: के लिए ($ i = 0; $ i <गिनती ($ सरणी); $ i ++) {प्रिंट ($ सरणी [$ i] ['नाम']); }
डैक्स

64

निम्नलिखित दो आयामी सरणी में समकक्ष और परिणाम हैं:

$array = array(
    array(0, 1, 2),
    array(3, 4, 5),
);

या

$array = array();

$array[] = array(0, 1, 2);
$array[] = array(3, 4, 5);

7
उन दो आयामी सरणियों में परिणाम नहीं है, बल्कि सरणियों की एक सरणी में परिणाम।
डिटानचेन

5
@dotancohen यह सिर्फ शब्दार्थ है, वास्तव में। व्यावहारिक रूप से दोनों अवधारणाएं समान हैं। C # जैसी भाषाओं में उपयोग किए जाने वाले प्रकार और बहु-आयामी सरणियों के बीच एकमात्र अंतर वाक्यविन्यास है। और उस पर वाक्य रचना में काफी छोटा अंतर।
Atli

1
C # में कम से कम, मेमोरी आवश्यकताएं अलग हैं। प्रत्येक सरणी के लिए आवश्यक सरणी में केवल सारणी आवंटित होती है। एक दो-आयामी सरणी पूरे एन * एम स्मृति का आवंटन करती है।
19anc में dotancohen

6
@dotancohen PHP और C # के बीच मेमोरी की आवश्यकताएं सामान्य रूप से बहुत अलग हैं, क्योंकि प्रत्येक भाषा के रनटाइम में मेमोरी को संभालने का अपना तरीका है। यह आम तौर पर कुछ ऐसा नहीं है जो आप अभ्यास में चिंतित हैं। तब तक नहीं जब तक आप किसी खेल की तरह लंबे समय तक चलने वाले, उच्च-प्रदर्शन वाले ऐप का निर्माण नहीं करते हैं, इस स्थिति में PHP एक भाषा का एक विषम विकल्प होगा।
१४:१४

40

सिर्फ घोषणा करें? आपको नहीं करना है। बस सुनिश्चित करें कि चर मौजूद है:

$d = array();

एरे को गतिशील रूप से आकार दिया जाता है, और गैर-अस्तित्ववादी तत्व के लिए कुछ भी लिखने का प्रयास इसे बनाता है (और यदि आवश्यक हो तो संपूर्ण सरणी बनाता है)

$d[1][2] = 3;

यह पूर्व घोषणाओं के बिना किसी भी आयाम के लिए मान्य है।


3
सिवाय इसके कि आपको आयामों के बारे में कुछ नहीं बताता है। यदि आप एक एम x एन 2 डी सरणी की घोषणा कर रहे हैं, तो संभावना यह एक मैट्रिक्स है और अगर यह एक मैट्रिक्स संभावना है कि आप गुणा या उस पर कुछ कर रहे हैं जो तत्वों पर पुनरावृत्ति की आवश्यकता होगी, जो आप नहीं कर सकते हैं यदि यह है "विरल" और आयामों को नहीं जानते।
क्लेटस

@ बटुआ: आप countसही आयाम पर उपयोग कर सकते हैं , उदाहरण के लिए count($d[1]), जब तक मैं आपकी बात को गलत नहीं समझ रहा हूँ?
असंतुष्टगीतगोत

2
फिर भी, PHP में बहुआयामी सरणियाँ नहीं हैं। संभावना हमेशा बाहर निकल जाएगी कि सरणियों की एक सरणी विरल हो सकती है। तो, कैसे एक वर्ग बनाने के बारे में जो सरणियों का उपयोग करके मैट्रिक्स को लागू करता है, कम से कम तब आप उचित कार्यान्वयन का अधिक ध्यान रखेंगे।
डॉन

26

सबसे पहले, PHP में बहुआयामी सरणियाँ नहीं हैं, इसमें सरणियों के सरणियाँ हैं।

दूसरे, आप एक फ़ंक्शन लिख सकते हैं जो यह करेगा:

function declare($m, $n, $value = 0) {
  return array_fill(0, $m, array_fill(0, $n, $value));
}

2
क्या आपको "सरणियों या सरणियों" के बजाय "सरणियों के सरणियों" का मतलब नहीं है ?
असफ

@Asaph: हाँ मैंने किया। फिक्स्ड। धन्यवाद।
क्लेटस

1
शून्य की एक सरणी स्थापित करना पूरी तरह से व्यर्थ व्यायाम है। आपको एक सरणी घोषित करने की आवश्यकता नहीं है, बस इसका उपयोग करें।
असंतुष्टगीत नेव

7
सिवाय अगर आपको इस पर पुनरावृति करने की आवश्यकता है या यह निर्धारित करना है कि जैसे आप मैट्रिक्स गुणा कर रहे हैं तो यह आकार है। सरणी मानों को भरने के लिए पूरी तरह से मान्य मामला है।
क्लेटस

11

एक सरल, "भरने के रूप में तुम जाओ" समाधान के लिए:

$foo = array(array());

यह आपको एक लचीला छद्म दो आयामी सरणी प्राप्त करेगा जो $ foo [ n ] [ n ] धारण कर सकता है जहां n <= your (निश्चित रूप से आपके स्मृति आकार की सामान्य बाधाओं द्वारा सीमित है, लेकिन आपको वह विचार मिलता है जिसकी मुझे आशा है)। यह, सिद्धांत रूप में, आप की जरूरत के रूप में कई उप सरणियों बनाने के लिए बढ़ाया जा सकता है।


9

या बड़े सरणियों के लिए, सभी समान मूल्य के साथ:

$m_by_n_array = array_fill(0, $n, array_fill(0, $m, $value);

एक पैदा करेगा $mद्वारा $nकरने के लिए सब कुछ सेट के साथ सरणी $value


3

जहां तक ​​मुझे पता है कि ऐसा करने के लिए php फ़ंक्शन में कोई अंतर्निहित नहीं है, तो आपको इसे लूप के माध्यम से या एक कस्टम विधि के माध्यम से करने की आवश्यकता है जो कि @Amber द्वारा जवाब में दिए गए array_fill की तरह कुछ को पुन: कॉल करता है;

मैं मान रहा हूं कि आपने सरणियों का खाली लेकिन गहन वर्णन किया है। उदाहरण के लिए, आप 3 सरणियों के एक सरणी के नीचे जैसा अंतिम परिणाम चाहते हैं :

   $final_array = array(array(), array(), array());

यह सिर्फ हाथ कोड के लिए सरल है, लेकिन 3 सरणियों के 3 सरणियों के एक सरणी की तरह एक मनमाने आकार के सरणी के लिए उपयोग करने से पहले इसे शुरू करने के लिए जटिल होना शुरू होता है:

     $final_array = array(array(array(), array(), array()), array(array(), array(), array()), array(array(), array(), array()));

...आदि...

मुझे निराशा मिलती है। चेक या त्रुटियों को फेंकने के बिना किसी भी गहराई का उपयोग करने के लिए सरणियों के एक प्रारंभिक सरणी को घोषित करने का एक आसान तरीका होना अच्छा होगा।


3

एटली के जवाब ने मुझे यह समझने में मदद की। यहां दो-आयामी सरणी के माध्यम से पुनरावृति कैसे करें, इसका एक उदाहरण है। यह नमूना दिखाता है कि किसी सरणी के ज्ञात नामों के मानों को कैसे खोजना है और यह भी कि आप उन सभी क्षेत्रों से गुजरते हैं जहां आप पाते हैं। मुझे उम्मीद है कि यह किसी की मदद करता है।

$array = array(
    0 => array(
        'name' => 'John Doe',
        'email' => 'john@example.com'
    ),
    1 => array(
        'name' => 'Jane Doe',
        'email' => 'jane@example.com'
    ),
);

foreach ( $array  as $groupid => $fields) {
    echo "hi element ". $groupid . "\n";
    echo ". name is ". $fields['name'] . "\n";
    echo ". email is ". $fields['email'] . "\n";
    $i = 0;
    foreach ($fields as $field) {
         echo ". field $i is ".$field . "\n";
        $i++;
    }
}

आउटपुट:

hi element 0
. name is John Doe
. email is john@example.com
. field 0 is John Doe
. field 1 is john@example.com
hi element 1
. name is Jane Doe
. email is jane@example.com
. field 0 is Jane Doe
. field 1 is jane@example.com

2

और मेरे लिए इस बारे में तर्क है कि एक सरणी को विरल होना चाहिए या नहीं यह संदर्भ पर निर्भर करता है।

उदाहरण के लिए, अगर $ a [6] [9] को पॉप्युलेट नहीं किया जाता है, तो यह $ [6] [9] के बराबर होता है, उदाहरण के लिए "" या 0 के साथ।


2
$r = array("arr1","arr2");

एकल सरणी तत्व जो आपको लिखना चाहिए गूंजने के लिए:

echo $r[0];
echo $r[1];

उत्पादन होगा: arr1 arr2


2
यह एक आयामी सरणी है। एक बहुआयामी सरणी में बहुत कम से कम, एक सरणी के भीतर एक सरणी होती है।
माइक स्ट्रैटन

2

और मुझे यह पसंद है:

$cars = array
  (
  array("Volvo",22),
  array("BMW",15),
  array("Saab",5),
  array("Land Rover",17)
  );

0

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

$array = Arr::setNestedElement([], '1.2.3', 'value');

जो उत्पादन करेगा

[
  1 => [
    2 => [
      3 => 'value'
    ]
  ]
]

0

आप इसे आज़मा सकते हैं, लेकिन दूसरे आयाम मान अनुक्रमित के बराबर होंगे:

$array = array_fill_keys(range(0,5), range(0,5));

खाली सरणी के लिए थोड़ा और अधिक जटिल:

$array = array_fill_keys(range(0, 5), array_fill_keys(range(0, 5), null));


0

आपको एक सरणी को दूसरे सरणी में घोषित करने की आवश्यकता है।

$arr = array(array(content), array(content));

उदाहरण:

$arr = array(array(1,2,3), array(4,5,6));

सरणी से पहला आइटम प्राप्त करने के लिए, आप उपयोग करेंगे $arr[0][0], यह सरणी से पहली सरणी के पहले आइटम की तरह है । दूसरी सरणी से $arr[1][0]पहला आइटम सरणी से लौटाएगा ।

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