2011-06-18 19 views
34

मैं की तरह एक सरणी है के साथ सरणी मूल्य प्राप्त करें:पीएचपी एक संख्यात्मक इंडेक्स

$array = array('foo' => 'bar', 33 => 'bin', 'lorem' => 'ipsum'); 
echo native_function($array, 0); // bar 
echo native_function($array, 1); // bin 
echo native_function($array, 2); // ipsum 

तो, यह देशी समारोह एक संख्यात्मक इंडेक्स (दूसरा आर्ग) के आधार पर एक मूल्य वापसी होगी, Assoc कुंजी अनदेखी, की तलाश में सरणी में असली स्थिति।

क्या PHP में ऐसा करने के लिए कोई मूल कार्य है या क्या मुझे इसे लिखना चाहिए? धन्यवाद

+3

यह एक बुरा विचार की तरह लगता है। इसके लिए आपको क्या चाहिए? क्या इस मामले में वास्तव में संख्यात्मक कुंजी होने के लिए और उप-सरणी के सदस्य के रूप में 'foo' मान' के लिए बहुत बेहतर नहीं होगा? –

+0

मुझे यह भी लगता है कि यह खराब डिजाइन की तरह दिखता है। क्या आप हमें बता सकते हैं कि आप क्या करने की कोशिश कर रहे हैं? शायद बेहतर समाधान है। – Alp

उत्तर

11

array_values() काफी तुम क्या चाहते हो जाएगा:

$numeric_indexed_array = array_values($your_array); 
// $numeric_indexed_array = array('bar', 'bin', 'ipsum'); 
print($numeric_indexed_array[0]); // bar 
+0

... और, PHP 5.4 के रूप में, इसे नीचे क्रश करें: प्रिंट करें (array_values ​​($ your_array) [0]); – Pancho

77
$array = array('foo' => 'bar', 33 => 'bin', 'lorem' => 'ipsum'); 
$array = array_values($array); 
echo $array[0]; //bar 
echo $array[1]; //bin 
echo $array[2]; //ipsum 
4

हाँ, अदिश मूल्यों के लिए, implode और array_slice का एक संयोजन करना होगा:

$bar = implode(array_slice($array, 0, 1)); 
$bin = implode(array_slice($array, 1, 1)); 
$ipsum = implode(array_slice($array, 2, 1)); 

या यह मिश्रण array_values और list (धन्यवाद @nikic) के साथ ताकि यह सभी प्रकार के मानों के साथ काम करे:

list($bar) = array_values(array_slice($array, 0, 1)); 
+0

+1 हालांकि स्केलर मान सीमा को हटाने के लिए मैंने 'सूची ($ बार) = array_slice ($ array, 0, 1) 'का उपयोग किया होगा;) – NikiC

+0

@nikic: मैंने इसके बारे में सोचा, दुर्भाग्य से,' array_slice' स्ट्रिंग को संरक्षित रखेगा कुंजी (भले ही * preserve_keys * * झूठी * है), इसलिए आप उस मामले में 'list' का उपयोग नहीं कर सकते हैं, जब तक कि आप परिणामी सरणी को' array_values ​​'न करें। वैसे भी, मुझे लगता है कि एक समाधान भी है, संपादित किया गया। धन्यवाद। – netcoder

4

मैं array_values() समारोह किसी भी नुकसान के खिलाफ इस बारे में मेरा विचार का प्रस्ताव कर रहा हूँ, क्योंकि मुझे लगता है कि एक सीधा प्राप्त कार्य नहीं है। इस तरह इसे संख्यात्मक रूप से अनुक्रमित सरणी के मानों की प्रतिलिपि बनाना और फिर पहुंच बनाना है। यदि PHP वांछित तत्व की स्थिति में स्वचालित रूप से एक पूर्णांक का अनुवाद नहीं करता है, तो शायद थोड़ा बेहतर समाधान उस फ़ंक्शन से हो सकता है जो एक काउंटर के साथ सरणी चलाता है जब तक वह वांछित स्थिति तक नहीं पहुंच जाता है, फिर तत्व को वापस लौटाता है ।

तो काम बहुत बड़ी आकारों के लिए अनुकूलित किया जाएगा, क्योंकि एल्गोरिदम तुरंत छोटे से रोकने के लिए सर्वश्रेष्ठ प्रदर्शन सूचकांक होगा। समाधान में array_values() पर प्रकाश डाला गया है, हालांकि, इसे पूरे सरणी के माध्यम से बहने वाले चक्र के साथ करना है, भले ही, उदाहरण के लिए, मुझे $ array [1] तक पहुंच प्राप्त करनी है।

function array_get_by_index($index, $array) { 

    $i=0; 
    foreach ($array as $value) { 
     if($i==$index) { 
      return $value; 
     } 
     $i++; 
    } 
    // may be $index exceedes size of $array. In this case NULL is returned. 
    return NULL; 
} 
+0

लेकिन क्या होगा यदि 'झूठा' एक लाया गया मूल्य होगा? 'शून्य' लौटना अभी भी खराब होगा लेकिन 'झूठी' से बेहतर होगा। – user619271

+0

इस प्रकार की स्थिरता को ध्यान में रखते हुए, मुझे मूल्य शून्य मिलेगा या यदि इनपुट इंडेक्स सरणी के आकार से अधिक हो, या यदि सूचकांक इनपुट से लक्ष्य मान न्यूल है। इस मामले में मैं आपसे सहमत हूं। हालांकि FALSE और NULL फ़ंक्शन खाली() पर एक ही परिणाम देते हैं, जो कि किसी भी परिदृश्य में अगली जांच होगी, यह इस कार्य को कॉल करने के लिए समझ में आता है। –

संबंधित मुद्दे