2016-11-20 8 views
6

पर आधारित PHP SPLIT सरणी मेरे पास एक सरणी है।कुंजी स्पीड

 

    Array 
    (
     [initial] => MSS 
     [hour] => 5.2 
     [row_checker_1] => 1 
     [project_name_1] => KGD001 
     [project_shortcode_1] => KGD001 
     [5_1] => 23 
     [6_1] => 3.3 
     [4_1] => 23.2 
     [remarks_1] => on going 
     [task_id] => 76 
     [row_checker_2] => 2 
     [project_name_2] => DG001 
     [project_shortcode_2] => DG001 
     [5_2] => 1.1 
     [6_2] => 2.2 
     [4_2] => 3.1 
     [remarks_2] => on going 
    ) 

अब मैं विभाजित करने के लिए सभी तत्व ऊपरी सीमा कुंजी "project_shortcode_1" और कम रेंज की कुंजी है remarks_1 है चाहता हूँ।

तो, नई सरणी दिखना चाहिए:

 

    array 
    (
     [5_1] => 23 
     [6_1] => 3.3 
     [4_1] => 23.2 
    ) 

+4

तुम्हें पता है कि सरणी में कुंजी भिन्न क्रम में हो सकता है ...? –

+0

हो सकता है कि आपको केवल 'NUMBER_1' कुंजी वाले मानों की आवश्यकता हो? –

+0

यदि NUMBER_1 संभव है तो यह सही समाधान होगा। –

उत्तर

1

जब से तुम टिप्पणी है कि आप सभी मूल्यों है कि प्रारूप NUMBER_1 में हैं मुझे लगता है कि आप अपने सरणी के माध्यम से लूप करना होगा प्राप्त करने के लिए पसंद करते हैं में उल्लेख किया और regex के साथ मान नामों की जांच करें, फिर मानदंडों को पूरा करते समय मूल्यों को एक नई सरणी में जोड़ें। यहाँ मैं यह कैसे करना होगा है:

$myArray = array(
    'initial' => 'MSS', 
    'hour' => '5.2', 
    'row_checker_1' => '1', 
    'project_name_1' => 'KGD001', 
    'project_shortcode_1' => 'KGD001', 
    '5_1' => '23', 
    '6_1' => '3.3', 
    '4_1' => '23.2', 
    'remarks_1' => 'on going', 
    'task_id' => '76', 
    'row_checker_2' => '2', 
    'project_name_2' => 'DG001', 
    'project_shortcode_2' => 'DG001', 
    '5_2' => '1.1', 
    '6_2a' => '2.2', 
    '4_2' => '3.1', 
    'remarks_2' => 'on going' 
); 

$newArray = array(); 
foreach ($myArray as $k => $v) { 
    $rightFormat = preg_match('/^\d+_\d+$/', $k); 
    if ($rightFormat) 
     $newArray[$k] = $v; 
} 
print_r($newArray); 

उस मामले में print_r का परिणाम होगा:

सरणी ([5_1] => 23 [6_1] => 3.3 [4_1] => 23.2 [5_2] => 1.1 [6_2] => 2.2 [4_2] => 3,1)

अंडरस्कोर के बाद संख्या हमेशा होना चाहिए, तो 1 तो /^\d+_1$/ करने के लिए /^\d+_\d+$/ से regex बदल जाते हैं।

आप चारों ओर खेल सकते हैं और देख सकते हैं कि रेगेक्स here कैसे काम करता है।

पीएस: मैंने सभी मूल्यों को सुविधा से तारों पर सेट कर दिया है। इसे संशोधित करने के लिए स्वतंत्र महसूस करें।

+0

मैंने रेगेक्स को थोड़ा सा संशोधित किया है: '/ \ d + _ \ d /' से '/^\ d + _ \ d $ /' से, यह सुनिश्चित करता है कि '5_1a' या' a5_1' जैसी कुंजी ' नई सरणी में नहीं मिलता है। –

2

सरणी कुंजी का उपयोग करने के लिए ध्वज ARRAY_FILTER_USE_KEY के साथ array_filter का उपयोग करें, और वांछित कुंजी प्राप्त करने के लिए आवश्यक तर्क के साथ तुलना करें। यह PHP 5.6 से काम करता है।

$arr = array ("initial" => "MSS", 
     "hour" => 5.2, 
     "row_checker_1" => 1, 
     "project_name_1" => "KGD001", 
     "project_shortcode_1" => "KGD001", 
     "5_1" => 23, 
     "6_1" => 3.3, 
     "4_1" => 23.2, 
     "remarks_1" => "on going", 
     "task_id" => 76, 
     "row_checker_2" => 2, 
     "project_name_2" => "DG001", 
     "project_shortcode_2" => "DG001", 
     "5_2" => 1.1, 
     "6_2" => 2.2, 
     "4_2" => 3.1, 
     "remarks_2" => "on going", 
    ); 

// PHP > 5.6 
$result = array_filter($arr, function($k){ 
    $var = explode('_', $k); 
    return is_numeric($var[0]) && $var[1]==1; 
}, ARRAY_FILTER_USE_KEY); 
+1

यह एक अच्छी पोस्ट है, लेकिन मैं सिर्फ फ्लैग करना चाहता हूं कि '7_1_gotcha "=> 666' परिणाम सरणी के लिए अर्हता प्राप्त करेगी लेकिन वहां नहीं होना चाहिए। यह एक पूरी तरह से निर्मित सरणी तत्व (बंदर रिंच) है - मुझे नहीं पता कि यह कैसे संभव है कि इस विधि भेद्यता वास्तव में परेशानी का कारण बन जाएगी। मेरा मुद्दा यह है: यह एक प्रारंभ-टू-फिनिश रेगेक्स पैटर्न का उपयोग न करने का नकारात्मक पक्ष है। – mickmackusa

+0

अच्छा बिंदु। फ़िल्टर परिस्थितियों को परिष्कृत करना ('गिनती ($ var) == 2') उस भेद्यता से बचाता है। मुझे लगता है कि यह रेगेक्स पैटर्न समाधान चुनने के लिए जरूरतों और प्रदर्शन की बात है। – Dez

+1

मैं इस टिप्पणी के बाद आपको अकेला छोड़ने का वादा करता हूं;) ... "2e7_1" => 666' भी पास होगा। यह 'विस्फोट()' की गलती नहीं है, लेकिन 'is_numeric() की क्षमाशील प्रवृत्तियों की है। – mickmackusa

2

क्या आप की जरूरत सभी सीमाओं NUMBER_N साथ एक बहुआयामी सरणी है, तो कुछ इस तरह (Dmitriy Demir जवाब से बढ़ाया गया) का उपयोग करें:

$myArray = array(
    'initial' => 'MSS', 
    'hour' => '5.2', 
    'row_checker_1' => '1', 
    'project_name_1' => 'KGD001', 
    'project_shortcode_1' => 'KGD001', 
    '5_1' => '23', 
    '6_1' => '3.3', 
    '4_1' => '23.2', 
    'remarks_1' => 'on going', 
    'task_id' => '76', 
    'row_checker_2' => '2', 
    'project_name_2' => 'DG001', 
    'project_shortcode_2' => 'DG001', 
    '5_2' => '1.1', 
    '6_2' => '2.2', 
    '4_2' => '3.1', 
    'remarks_2' => 'on going' 
); 

function splitRange($a){ 
    $newArray = array(); 
    foreach ($a as $k => $v) { 
     $rightFormat = preg_match('/^\d+_(\d+)$/', $k, $index); 
     if ($rightFormat) 
      $newArray[$index[1]][$k] = $v; 
    } 
    return $newArray; 
} 

print_r(splitRange($myArray)); 
कुछ

परिणाम होगा जैसे:

Array 
(
    [1] => Array 
     (
      [5_1] => 23 
      [6_1] => 3.3 
      [4_1] => 23.2 
     ) 

    [2] => Array 
     (
      [5_2] => 1.1 
      [6_2] => 2.2 
      [4_2] => 3.1 
     ) 

) 

NUMBER_N से सरणी की अनुक्रमणिका से।

1

एक रेगेक्स-आधारित समाधान इस प्रश्न के लिए उपयुक्त लगता है।

preg_grep() एक फ़ंक्शन है जो किसी सरणी में प्रत्येक मान पर रेगेक्स फ़िल्टर लागू करने के लिए डिज़ाइन किया गया है। इस मामले के लिए मैं थोड़ा और tweaking आवश्यक है क्योंकि चाबियाँ इसके बजाय फ़िल्टर किया जाना चाहिए।

एक-लाइनर:

$output=array_intersect_key($input,array_flip(preg_grep("/^\d+_1$/",array_keys($input))))); 
/* array (
     '5_1' => 23, 
     '6_1' => 3.3, 
     '4_1' => 23.2, 
    )*/ 

यहाँ कदम-दर-कदम सरणी हेरफेर

array_keys($input); // create array with input keys as values 
/* array (
     0 => 'initial', 
     1 => 'hour', 
     2 => 'row_checker_1', 
     3 => 'project_name_1', 
     4 => 'project_shortcode_1', 
     5 => '5_1', 
     6 => '6_1', 
     7 => '4_1', 
     8 => 'remarks_1', 
     9 => 'task_id', 
     10 => 'row_checker_2', 
     11 => 'project_name_2', 
     12 => 'project_shortcode_2', 
     13 => '5_2', 
     14 => '6_2', 
     15 => '4_2', 
     16 => 'remarks_2', 
    ) */ 

preg_grep("/^\d+_1$/",array_keys($input)); // filter the input array using regex pattern 
/* array (
     5 => '5_1', 
     6 => '6_1', 
     7 => '4_1', 
    ) */ 

array_flip(preg_grep("/^\d+_1$/",array_keys($input))); // flip the filtered array 
/* array (
     '5_1' => 5, 
     '6_1' => 6, 
     '4_1' => 7, 
    )*/ 

array_intersect_key($input,array_flip(preg_grep("/^\d+_1$/",array_keys($input)))); // filter input by comparing keys against filtered array 
/* array (
     '5_1' => 23, 
     '6_1' => 3.3, 
     '4_1' => 23.2, 
    )*/ 
संबंधित मुद्दे