2009-10-20 20 views
5

मैं इस सरणी से बाहर स्टॉक मूल्यों को प्राप्त करने की आवश्यकता पर मैच:पैटर्न एक सरणी कुंजी

Array ( 
[stock0] => 1 
[stockdate0] => 
[stock1] => 3 
[stockdate1] => apple 
[stock2] => 2 [ 
stockdate2] => 
) 

मैं इस सरणी, जहां सरणी key = "शेयर" + 1 वाइल्डकार्ड वर्ण पर पैटर्न मैच की जरूरत है। मैंने PHP मैनुअल पर हर दूसरे मूल्य प्राप्त करने के लिए सरणी फ़िल्टर फ़ंक्शन का उपयोग करने का प्रयास किया है लेकिन खाली मान इसे फेंकने लगते हैं। मैंने कई अलग-अलग चीजों की कोशिश की लेकिन मुझे कुछ भी काम नहीं कर रहा है।

क्या यह किया जा सकता है?

+0

हम समारोह आप array_filter गुजर रहे हैं देख सकते हैं? –

+0

आप वास्तव में क्या हासिल करने का प्रयास करते हैं? – Gumbo

+0

@ जेफ ओबर समारोह भी ($ वर) { वापसी (($ var & 1)); !} print_r (array_filter ($ शेयर, "यहां तक ​​कि")); @ Gumbo मैं एक फार्म प्रसंस्करण कर रहा हूँ पारित करने के लिए । एक डेटाबेस के लिए चर इस भाग रंग विविधताओं पर शेयर नियंत्रण स्थापित करने के लिए है यह इस तरह संग्रहीत किया जाता है:। लाल | नीले | ग्रीन 1 | 2 | 3 || फ़र, 2010 दूसरी पंक्ति चलाता है 3 यदि बयान जो एप्रोपिएट संदेश प्रदर्शित करते हैं (जो कि यदि यह संख्या 3 है तो तारीख को असम्बद्ध कर देगा) इसलिए जब यह ब्राउज़र पक्ष प्रदर्शित होता है तो मैं आसानी से डिलीमीटरों को विस्फोट करके सरणी प्राप्त कर सकता हूं। – Oliver

उत्तर

2

array_filter कुंजी के लिए पहुँच नहीं है और इसलिए अपने काम के लिए सही उपकरण नहीं है।

मैं belive है कि आप क्या करने के लिए देख रहे हैं यह है:

$stocks = Array ( 
"stock0" => 1, 
"stockdate0" => '', 
"stock1" => 3, 
"stockdate1" => 'apple', 
"stock2" => 2, 
"stockdate2" => '' 
); 


$stockList = array(); //Your list of "stocks" indexed by the number found at the end of "stock" 

foreach ($stocks as $stockKey => $stock) 
{ 
    sscanf($stockKey,"stock%d", &stockId); // scan into a formatted string and return values passed by reference 
    if ($stockId !== false) 
    $stockList[$stockId] = $stock; 
} 

अब $ stocklist इस तरह दिखता है:

Array ( 
[0] => 1 
[1] => 3 
[2] => 2 
) 

आप थोड़ा इसके साथ उपद्रव करने की आवश्यकता हो सकती है, लेकिन मुझे लगता है यही वह है जिसे आप पूछ रहे हैं।

हालांकि, यदि आपके पास ऐसा करने का विकल्प है तो आपको वास्तव में जेफ ओबर की सलाह का पालन करना चाहिए।

+0

यह अच्छा लग रहा है।
पल लेकिन यह लौटा रहा है पर
[0] => ''
[1] => सेब
[2] => ''

आईई stockdate बजाय शेयर मूल्य
मुझे लगता है कि मैं इसे समायोजित कर सकता हूं - बस मुझे इसके साथ भी मदद करने में संकोच न करें! – Oliver

+0

मैंने "स्टॉक% d" (गलत मान) को "स्टॉकडेट डी%" पर स्विच करने का प्रयास किया जिसने मुझे मूल्य दिया: [] => 1 [0] => 2 [1] => 3 [2] => '' । क्या आप जानते हैं कि चाबियाँ कैसे सीधी हैं? – Oliver

4
<?php 

$foo = 
array ( 
'stock0' => 1, 
'stockdate0' => 1, 
'stock1' => 3, 
'stockdate1' => 2, 
); 

$keys = array_keys($foo); 
foreach ($keys as $key) { 
    if (preg_match('/stock.$/', $key)) { 
    var_dump($key); 
    } 
} 

मैं आशा करती हूं मैं सही ढंग से व्याख्या की है और आप 'शेयर' चाहता था, 1 वाइल्डकार्ड वर्ण नहीं thats एक नई पंक्ति है, तो स्ट्रिंग के अंत।

+1

यह ओपी के प्रश्न के सीधे जवाब की तरह दिखता है।Temp चर $ कुंजी से छुटकारा पाने के लिए मैं इस समाधान के लिए http://www.refactoring.com/catalog/inlineTemp.html लागू करूंगा। –

+1

मैंने केवल उन कारणों के लिए अस्थायी परिवर्तनीय इजाजत छोड़ी जो उन्हें फिर से उपयोग करना चाहते थे, और आम तौर पर अभिव्यक्तियों को समझने के लिए कठिन बनाने के बजाय नए शौकों को समझना आसान होता है। –

+0

मैं रेगेक्स का एक बड़ा प्रशंसक हूं और यह निश्चित रूप से इस तरह से किया जा सकता है। – ChronoFish

4

आप के रूप में उन की दुकान चाहिए:

Array(
    [0] => Array(
    stock => 1, 
    stockdate => ... 
), 
    [1] => Array(
    stock => 3, 
    stockdate => apple 
), 
    ... 
) 
+1

मैं वास्तव में इसे $ _POST सरणी से प्राप्त कर रहा हूं। मुझे इसमें बहुत पसंद नहीं है। – Oliver

0

ठीक कामकाजी समाधान: क्रोनोफिश के लिए ग्रीन!

$stockList = array(); //Your list of "stocks" indexed by the number found at the end of "stock" 

foreach ($stock as $stockKey => $stock) 
{ 
    sscanf($stockKey,"message%d", $stockId); // scan into a formatted string and return values passed by reference 
    if ($stockId !== false) { 
    $stockList[$stockId] = $stock; 
} 

$stockList=array_values($stockList); //straightens array keys out 
$stockList = array_slice ($stockList, "0", $count); //gets rid of blank value generated at end of array (where $count = the array's orginal length) 
print_r ($stockList); 
1
# returns array('stock1' => 'foo') 
array_flip(preg_grep('#^stock.$#', array_flip(array('stock1' => 'foo', 'stockdate' => 'bar')))) 

सुनिश्चित नहीं हैं कि अच्छे प्रदर्शन regex और दो flips, लेकिन उत्कृष्ट रख-रखाव (लूप में कोई बग शिकार) के कारण है।

1

चूंकि PHP 5.6.0 flag विकल्प array_filter में जोड़ा गया है। यह आपको नहीं बल्कि अपने मूल्यों से सरणी कुंजी के आधार पर फिल्टर करने के लिए अनुमति देता है:

array_filter($items, function ($key) { 
    return preg_match('/^stock\d$/', $key); 
}, ARRAY_FILTER_USE_KEY); 
संबंधित मुद्दे