कैसे स्ट्रिंग से इंट में सरणी मान परिवर्तित करने के लिए?


233
$string = "1,2,3"
$ids = explode(',', $string);
var_dump($ids);

रिटर्न

array(3) {
  [0]=>
  string(1) "1"
  [1]=>
  string(1) "2"
  [2]=>
  string(1) "3"
}

मुझे मान के लिए टाइप स्ट्रिंग के बजाय इंट इंट का होना चाहिए। वहाँ एक foreach के साथ सरणी के माध्यम से पाशन और प्रत्येक स्ट्रिंग को int में परिवर्तित करने से बेहतर तरीका है?

जवाबों:


537

आप निम्नलिखित कोड द्वारा इसे प्राप्त कर सकते हैं,

$integerIDs = array_map('intval', explode(',', $string));

3
लेकिन अगर आपके पास स्ट्रिंग 'परीक्षण' है, तो आपको मिला: सरणी ([0] => 0)
दिमित्री डोबोवित्स्की

10
@ डमिट - यह सही है .... यह ओपी के सवाल का जवाब है, हर मामले में 100% सही नहीं है। ओपी में अल्पविराम-अलग-अलग संख्यात्मक मानों का एक स्ट्रिंग था, न कि पाठ और संख्याओं का एक पिक-एंड मिक्स
मार्क बेकर

1
array_filter ($ array, 'is_numeric') का बेहतर उपयोग करें, लेकिन यह `100% सही नहीं हो सकता, क्योंकि '0x539', '0b01011' संख्यात्मक मान है।
दिमित्री डबोवित्स्की 14

35
@Dmitry - यदि आप किसी विशिष्ट प्रश्न के लिए 18 महीने पुराने उत्तर की आलोचना करना चाहते हैं क्योंकि यह प्रत्येक बोधगम्य परिस्थिति में सही नहीं है, और आपको लगता है कि आपके पास एक बेहतर समाधान है, तो इस प्रश्न के बारे में अपने स्वयं के उत्तर को जोड़ने के लिए स्वतंत्र महसूस करें, आपका उत्तर क्यों बेहतर है .... कोई भी आपको रोक नहीं रहा है ... लेकिन इस उत्तर को छोड़ दें
मार्क बेकर

intval ( ) कास्ट (int) की तुलना में कम प्रदर्शन करने वाला है । तो बेहतर (int) के साथ एक और समाधान का उपयोग करें। विधि 3 यहाँ देखें
फाबियान पॉनिक

43

यह लगभग 3 गुना तेजी से है explode(), array_map()और intval():

$integerIDs = json_decode('[' . $string . ']', true);

1
@ अपने स्ट्रिंग में शायद एक वाक्यविन्यास त्रुटि है। इसे इस तरह प्रारूपित किया जाना चाहिए: $ string = "1,2,3";
sgrodzicki 18

4
विस्फोट () + array_map () + intval () json_decode () के रूप में तेजी से नहीं हो सकता है, लेकिन यह स्पष्ट रूप से चुनने के लिए बेहतर विकल्प नहीं है ... आपको अन्य सामान जैसे कि json-syntax त्रुटियों को संभालने की आवश्यकता है जब आप की संभावना होती है। उपयोगकर्ता इनपुट को
सैनिटाइज़ करना

2
यह भयानक है, खासकर जब यह एक नक्शे + to_int की तुलना में तेज़ है! php, यह अब तक कैसे आ सकता है ...
phoet

3
यह सिर्फ माइक्रो ऑप्टिमाइज़ेशन है। इस तरह के एक छोटे ऑपरेशन को पूर्ण करने के लिए स्ट्रिंग से भरे सरणी को कास्टिंग करने की आवश्यकता नहीं है। और अगर आपके सरणी में बहुत सारे और बहुत सारे तत्व हैं (जैसे कि सैकड़ों हजारों तत्व), तो इस ऑपरेशन की तुलना में आपके प्रोजेक्ट में एक और बड़ी समस्या है।
एंड्रियास


41

इसलिए बड़ी संख्या में पूर्णांक के उत्तर में वर्णित कुछ विधियों के प्रदर्शन के बारे में मैं उत्सुक था।

तैयारी

केवल 0 और 100 के बीच 1 मिलियन यादृच्छिक पूर्णांक की एक सरणी बनाकर। थान प्राप्त करने के लिए मैंने उन्हें फंसाया।

  $integers = array();

  for ($i = 0; $i < 1000000; $i++) {
      $integers[] = rand(0, 100);
  }

  $long_string = implode(',', $integers);

विधि 1

यह मार्क के उत्तर से एक लाइनर है:

$integerIDs = array_map('intval', explode(',', $long_string));

विधि 2

यह JSON दृष्टिकोण है:

  $integerIDs = json_decode('[' . $long_string . ']', true);

विधि 3

मैं मार्क के जवाब के संशोधन के रूप में इस एक के साथ आया था। यह अभी भी explode()फ़ंक्शन का उपयोग कर रहा है, लेकिन कॉल करने के बजाय array_map()मैं foreachओवरहेड से बचने के लिए काम करने के लिए नियमित लूप का उपयोग कर रहा हूं array_map()। मैं भी (int)बनाम के साथ पार्स कर intval()रहा हूं, लेकिन मैंने दोनों की कोशिश की, और प्रदर्शन के मामले में बहुत अंतर नहीं है।

  $result_array = array();
  $strings_array = explode(',', $long_string);

  foreach ($strings_array as $each_number) {
      $result_array[] = (int) $each_number;
  }

परिणाम:

Method 1        Method 2        Method 3
0.4804770947    0.3608930111    0.3387751579
0.4748001099    0.363986969     0.3762528896
0.4625790119    0.3645150661    0.3335959911
0.5065748692    0.3570590019    0.3365750313
0.4803431034    0.4135499001    0.3330330849
0.4510772228    0.4421861172    0.341176033
0.503674984     0.3612480164    0.3561749458
0.5598649979    0.352314949     0.3766179085
0.4573421478    0.3527538776    0.3473439217

0.4863037268    0.3742785454    0.3488383293

निचला रेखा औसत है। ऐसा लगता है कि पहली विधि 1 मिलियन पूर्णांकों के लिए थोड़ी धीमी थी, लेकिन मैंने विधि 2 के 3x प्रदर्शन लाभ को नोटिस नहीं किया, जैसा कि उत्तर में कहा गया है। ऐसा हुआ किforeach कि मेरे मामले में लूप सबसे तेज था। मैंने Xdebug के साथ बेंचमार्किंग की है।

संपादित करें: जब से मूल रूप से पोस्ट किया गया था तब से कुछ समय हो गया है। स्पष्ट करने के लिए, बेंचमार्क php 5.6 में किया गया था।


1
मुझे वास्तव में आश्चर्य है कि क्या प्रदर्शन PHP 7 में समान रहा, और इससे भी अधिक उत्सुक कैसे विधि 1 array_map 3 विधि 3 कास्टिंग और क्लोजर / अनाम कॉलबैक के साथ संयुक्त होगा ...
jave.web

array_map(function($v){ return (int)$v; }, $strings_array);इसका मतलब है कि मैं
jave.web

मैंने PHP7.2 पर कुछ परीक्षण किए, जिसमें 10000000 तत्वों के साथ एक सरणी में 'intval' (विधि 2) के साथ array_map और अनाम फ़ंक्शन (विधि 3) के साथ array_map के साथ array_map का उपयोग किया। मैं परिणामों के साथ आया कि मेरी विधि 2 तेज है (~ 0.6s), फिर विधि 3 (~ 0.75s), फिर विधि 1 (~ 1.1s)
गेब्रियल लीमा

20

इस कोड का उपयोग एक क्लोजर के साथ किया गया है ( PHP 5.3यह में प्रस्तुत किया गया है ), यह स्वीकृत उत्तर की तुलना में थोड़ा तेज है और मेरे लिए, इसे पूर्णांक में डालने का इरादा स्पष्ट है:

// if you have your values in the format '1,2,3,4', use this before:
// $stringArray = explode(',', '1,2,3,4');

$stringArray = ['1', '2', '3', '4'];

$intArray = array_map(
    function($value) { return (int)$value; },
    $stringArray
);

var_dump($intArray);

आउटपुट होगा:

array(4) {
  [0]=>
  int(1)
  [1]=>
  int(2)
  [2]=>
  int(3)
  [3]=>
  int(4)
}

1
डॉक्टर के अनुसार , यह अन्य उत्तरों में प्रस्तावित create_function से भी तेज है।
तक

1
@ आंटी जी, आप सही कह रहे हैं। PHP_ 7.2.0 के बाद से create_function को हटा दिया गया है।
एंड्रियास

14

मार्क के समाधान में, आप वापस लौटेंगे array([0]=> int 0)यदि आप "परीक्षण" जैसे स्ट्रिंग को पार्स करने का प्रयास करते हैं।

$integerIDs = array_map( 'intval', array_filter( explode(',', $string), 'is_numeric' ) );

7

यकीन नहीं है कि अगर यह तेज है, लेकिन दो बार सरणी को फ्लिप करने से पूर्णांक के लिए संख्यात्मक तार डाली जाएगी:

$string = "1,2,3, bla";
$ids = array_flip(array_flip(explode(',', $string)));
var_dump($ids);

7

एक वैकल्पिक छोटी विधि हो सकती है:

$r = explode(',', $s);
foreach ($r as &$i) $i = (int) $i;

यह विधि 3 के समान ही प्रदर्शन है।


मेरे लिए सबसे छोटा अभी तक लचीला समाधान।
रयान ऐरी

5

यदि आपके पास सरणी है:

$runners = ["1","2","3","4"];

और यदि आप उन्हें पूर्णांकों में शामिल करना चाहते हैं और कार्य करना चाहते हैं, तो निम्नलिखित कार्य करना चाहिए:

$newArray = array_map( create_function('$value', 'return (int)$value;'),
            $runners);

create_function को PHP 7.2.0 के बाद से हटा दिया गया है। बेहतर तरीके से create_function के बिना मेरा उत्तर देखें, लेकिन एक अनाम फ़ंक्शन के साथ।
एंड्रियास

4

मेरा समाधान कॉलबैक फ़ंक्शन की सहायता से प्रत्येक मान को कास्टिंग कर रहा है:

$ids = array_map( function($value) { return (int)$value; }, $ids )

3

इसे सरल रखें...

$intArray = array ();
$strArray = explode(',', $string);
foreach ($strArray as $value)
$intArray [] = intval ($value);

आप अन्य तरीकों की तलाश में क्यों हैं? लूपिंग बिना दर्द के काम करता है। यदि प्रदर्शन आपकी चिंता है, तो आप साथ जा सकते हैं json_decode ()। लोगों ने पोस्ट किया है कि इसका उपयोग कैसे करना है, इसलिए मैं इसे यहां शामिल नहीं कर रहा हूं।

ध्यान दें: === के बजाय == ऑपरेटर का उपयोग करते समय, आपके स्ट्रिंग मान स्वचालित रूप से संख्याओं (जैसे पूर्णांक या दोहरे) में परिवर्तित हो जाते हैं यदि वे बिना उद्धरण के एक वैध संख्या बनाते हैं। उदाहरण के लिए:

$str = '1';
($str == 1) // true but
($str === 1) //false

इस प्रकार, == आपकी समस्या को हल कर सकता है, कुशल है, लेकिन यदि आप तुलना में === का उपयोग करते हैं तो टूट जाएगा।


2

यदि आपके पास एक बहु-विषयक सरणी है, तो पहले वर्णित समाधानों में से कोई भी काम नहीं करेगा। यहाँ मेरा समाधान है:

public function arrayValuesToInt(&$array){
  if(is_array($array)){
    foreach($array as &$arrayPiece){
      arrayValuesToInt($arrayPiece);
    }
  }else{
    $array = intval($array);
  }
}

फिर, बस यह करें:

arrayValuesToInt($multiDimentionalArray);

यह इस तरह एक सरणी बना देगा:

[["1","2"]["3","4"]]

ऐसे दिखते हैं:

[[1,2][3,4]

(यह गहराई के किसी भी स्तर के साथ काम करेगा)


1

आप सरणी में मान परिवर्तित कर सकते हैं:

<?php

$ids = explode(',', $strings);
foreach ($ids as $index => $value) {
    $ids[$index] = (int)$value;
}

आप explodeफ़ंक्शन का रिटर्न मान भी लौटा सकते हैं$strings किसी अन्य चर ($ id) का उपयोग करने के बजाय और इसे पुन: व्यवस्थित कर सकते हैं।

मुझे लगता है कि यह समाधान सबसे अच्छा प्रदर्शन के साथ सबसे सुरक्षित तरीका है।



0

इनपुट => '["3", "6", "16", "120"]'

टाइप रूपांतरण जिसका मैंने उपयोग किया => (int) $ s;

function Str_Int_Arr($data){
    $h=[];
    $arr=substr($data,1,-1);
    //$exp=str_replace( ",","", $arr);
    $exp=str_replace( "\"","", $arr);
    $s=''; 
    $m=0;
    foreach (str_split($exp) as $k){
        if('0'<= $k && '9'>$k || $k =","){
            if('0' <= $k && '9' > $k){
                $s.=$k;
                $h[$m]=(int)$s;
            }else{
                $s="";
                $m+=1;
            } 
        } 
    } 
    return $h;
}
var_dump(Str_Int_Arr('["3","6","16","120"]'));

आउटपुट:

array(4) {
  [0]=>
  int(3)
  [1]=>
  int(6)
  [2]=>
  int(16)
  [3]=>
  int(120)
}

धन्यवाद

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