স্ট্রিং থেকে ইন্টারে অ্যারের মানগুলি কীভাবে রূপান্তর করবেন?


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"
}

টাইপ স্ট্রিংয়ের পরিবর্তে মানগুলি টাইপ ইন্টের হওয়া দরকার। ভবিষ্যতের সাহায্যে অ্যারের মধ্য দিয়ে লুপিং করা এবং প্রতিটি স্ট্রিংকে ইনটে রূপান্তর করার চেয়ে আরও ভাল উপায় কি আছে?

উত্তর:


537

কোড অনুসরণ করে আপনি এটি অর্জন করতে পারেন,

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

3
তবে আপনার যদি স্ট্রিং 'টেস্ট' থাকে, আপনি পেয়েছেন: অ্যারে ([0] => 0)
দিমিত্রি ডুবভিটস্কি

10
@ দিমিত্রি - এটা ঠিক .... এটি ওপি-র প্রশ্নের উত্তর, প্রতিটি সম্ভাব্য সম্পর্কিত প্রশ্নের প্রতিটি ক্ষেত্রেই 100% নিখুঁত নয়। ওপিতে কমা-বিভাজিত সংখ্যাসূচক মানগুলির একটি স্ট্রিং ছিল, টেক্সট এবং সংখ্যার কোনও পিক-অ্যান্ড মিশ্রণ নয়
মার্ক বেকার

1
অ্যারে_ফিল্টারটি ($ অ্যারে, 'is_numeric') আরও ভাল ব্যবহার করুন তবে এটি 100% সত্য হতে পারে না, কারণ '0x539', '0b01011' সংখ্যার মান।
দিমিত্রি ডুবভিটস্কি

35
@ দিমিত্রি - আপনি যদি কোনও নির্দিষ্ট প্রশ্নের 18 বছরের পুরানো জবাবের সমালোচনা করতে চান কারণ এটি প্রতিটি অনুমানযোগ্য পরিস্থিতিতে নিখুঁত নয়, এবং আপনার আরও ভাল সমাধান রয়েছে বলে মনে করেন, তবে এই প্রশ্নের সাথে নিজের উত্তর যুক্ত করতে দ্বিধা বোধ করবেন কেন আপনার উত্তর আরও ভাল .... কেউ আপনাকে বাধা দিচ্ছে না ... তবে এই উত্তরটি যেমন রয়েছে তেমন ছেড়ে দিন
মার্ক বাকের

(ইনটাল ) কাস্টের চেয়ে ইনক্যাল () কম পারফর্মেন্ট । সুতরাং আরও ভাল (int) এর সাথে আরও একটি সমাধান ব্যবহার করুন। এখানে পদ্ধতি 3 দেখুন
ফ্যাবিয়ান পিকন

43

এই তুলনায় প্রায় 3 বার দ্রুততর explode(), array_map()এবং intval():

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

1
@ বিনোদ আপনার স্ট্রিংয়ে সম্ভবত একটি বাক্য গঠন ত্রুটি রয়েছে। এটি এর মতো ফর্ম্যাট করা উচিত: $ স্ট্রিং = "1,2,3";
স্যাগ্রোডজিকি

4
বিস্ফোরিত () + অ্যারে_ম্যাপ () + অবধি () json_decode () এর মতো দ্রুত নাও হতে পারে তবে এটি বেছে নেওয়া আরও ভাল বিকল্প নয় ... আপনার জেসন-সিনট্যাক্স ত্রুটির মতো অন্যান্য জিনিসগুলি পরিচালনা করতে হবে যা সম্ভবত আপনি যখন হবেন স্যানিটাইজিং ব্যবহারকারী ইনপুট
stamabm

2
এটি ভয়াবহ, বিশেষত যখন এটি মানচিত্র + টু_িন্টের চেয়ে দ্রুত! পিএইচপি, কীভাবে এটি এতদূর আসতে পারত ...
ফোয়েট

3
এটি কেবল মাইক্রো অপ্টিমাইজেশন। পূর্ণসংখ্যার সাথে স্ট্রিংয়ে ভরাট অ্যারে কাস্টিংয়ের মতো ক্ষুদ্র অপারেশনটি অনুকূল করার দরকার নেই। এবং যদি আপনার অ্যারেতে প্রচুর এবং প্রচুর পরিমাণে উপাদান রয়েছে (উদাঃ কয়েক লক্ষ উপাদানসমূহ), তবে এই অপারেশনটির চেয়ে আপনার প্রকল্পে আরও একটি বড় সমস্যা রয়েছে।
আন্দ্রেস

1
: @Andreas আমাকে মাইক্রো অপ্টিমাইজেশান মত দেখাচ্ছে না blackfire.io/profiles/compare/...
sgrodzicki

41

সুতরাং আমি সংখ্যার পূর্ণসংখ্যার জন্য উত্তরে উল্লিখিত কয়েকটি পদ্ধতির পারফরম্যান্স সম্পর্কে আগ্রহী ছিলাম।

প্রস্তুতি

কেবল 0 এবং 100 এর মধ্যে 1 মিলিয়ন এলোমেলো পূর্ণসংখ্যার অ্যারে তৈরি করেছিলাম Than তার চেয়েও আমি স্ট্রিংটি পেতে তাদের প্ররোচিত করেছি।

  $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

এটি হল জেএসএন পদ্ধতির:

  $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লুপটি আমার ক্ষেত্রে দ্রুততম। আমি এক্সডিবাগের সাথে বেঞ্চমার্কিং করেছি।

সম্পাদনা: উত্তরটি মূলত পোস্ট হওয়ার পরে বেশ কিছুক্ষণ হয়েছে। স্পষ্ট করতে, বেঞ্চমার্কটি পিএইচপি 5.6 তে করা হয়েছিল।


1
আমি সত্যিই আশ্চর্য হই যে পিএইচপি in-তেও পারফরম্যান্স একই ছিল কিনা এবং আরও কৌতূহল কীভাবে পদ্ধতি 1 অ্যারে_ম্যাপটি 3 পদ্ধতিতে ingালাই এবং বন্ধ /
বেনাম

array_map(function($v){ return (int)$v; }, $strings_array);এই আমি বোঝাতে চেয়েছি
jave.web

আমি পিএইচপি .2.২ তে পূর্বাঞ্চ (পদ্ধতি 1), 'ইনটুল' (পদ্ধতি 2) দিয়ে অ্যারে_ম্যাপ এবং 10000000 উপাদান সহ একটি অ্যারে বেনামে ফাংশন (পদ্ধতি 3) দিয়ে অ্যারে_ম্যাপ ব্যবহার করে কিছু পরীক্ষা করেছি। আমি ফলাফলগুলি নিয়ে এসেছি যে আমার পদ্ধতি 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
দস্তাবেজের মতে, এটি অন্যান্য উত্তরে প্রস্তাবিত ক্রিয়াকলাপের চেয়েও দ্রুত।
untill

1
@ অবধি হ্যাঁ, আপনি ঠিক বলেছেন। এবং create_function পিএইচপি 7.2.0 থেকে অবচয় করা হয়েছে।
Andreas

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 পিএইচপি 7.2.0 থেকে অবচয় করা হয়েছে। আমার উত্তরটি create_function ছাড়াই ভাল, তবে একটি বেনামি ফাংশন দিয়ে দেখুন।
Andreas

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এবং অন্য ভেরিয়েবল ($ আইডিস) ব্যবহার না করে পুনরুক্ত করতে পারেন।

আমি মনে করি সেরা সমাধানের সাথে এই সমাধানটি সবচেয়ে নিরাপদ est



0

ইনপুট => '["3", "6", "16", "120"]'

টাইপ রূপান্তর আমি ব্যবহার করেছি => (int); গুলি;

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)
}

ধন্যবাদ

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.