পিএইচপি-তে অ্যারে কী হিসাবে একটি সাংখ্যিক স্ট্রিং


104

"123"কোনও পিএইচপি অ্যারেতে কী হিসাবে সংখ্যার স্ট্রিংটি কোনও পূর্ণসংখ্যায় রূপান্তরিত না করে ব্যবহার করা সম্ভব ?

$blah = array('123' => 1);
var_dump($blah);

কপি করে প্রিন্ট

array(1) {
  [123]=>
  int(1)
}

আমি চাই

array(1) {
  ["123"]=>
  int(1)
}

7
যেহেতু পিএইচপি হ'ল স্বল্প টাইপ করা হয়, "123"== 123প্রায় প্রতিটি কাজের জন্য। স্ট্রিং হিসাবে আপনি এটি বিশেষত চান হওয়ার কারণ কী (এবং কোনও সংঘটিত হওয়া খারাপ)?
একারমেক্সেল

17
কারণ আমার মনে আসে মতো বিন্যাস ফাংশন সম্পর্কিত array_merge "ইনপুট অ্যারে একই স্ট্রিং কী থাকে, তাহলে যে কী জন্য পরে মান আগের মুছে ফেলা হবে। পারেন, তবে অ্যারে সাংখ্যিক কী ধারণ , পরে মান না করবে না মূল মানটি ওভাররাইট করুন, তবে সংযোজন করা হবে।
ficuscr

8
আর একটি উদাহরণ যেখানে অ্যারে কী হিসাবে asort
সংখ্যাযুক্ত


4
আরেকটি ব্যবহারের কেস: ইউনিট টেস্ট করে JSON ডেটা স্থানান্তর। যেমন অ্যারেটিকে JSON এবং পিছনে রূপান্তর করা আপনাকে জোর দেয় না যে মূল এবং ফলাফল উভয়ই একই are
ডেভিড

উত্তর:


90

না; না এইটা না:

ম্যানুয়াল থেকে :

একটি কী কোনও হয় পূর্ণসংখ্যা বা স্ট্রিং। যদি কোনও কীটি কোনও পূর্ণসংখ্যার মানক উপস্থাপনা হয় তবে এর অর্থ ব্যাখ্যা করা হবে (অর্থাত "8" 8 হিসাবে ব্যাখ্যা করা হবে, "08" "08" হিসাবে ব্যাখ্যা করা হবে)।

অভিযোজ্য বস্তু

নীচের মন্তব্য কারণে আমি ভেবেছিলাম এটা যে বাতলান আচরণ মজা হবে অনুরূপ কিন্তু অভিন্ন জাভাস্ক্রিপ্ট অবজেক্ট কী করতে।

foo = { '10' : 'bar' };

foo['10']; // "bar"
foo[10]; // "bar"
foo[012]; // "bar"
foo['012']; // undefined!

107
পিএইচপি, সার্ভার সাইড আইই।
মেরেক

5
দেখে মনে হচ্ছে আসলে একটা উপায় আছে! আপনি কি এই উত্তরটির সাথে একমত নন? stackoverflow.com/a/35180513/247696
ফ্লিম

1
কিভাবে ?! .. foo [012] "বার" ফিরিয়ে দেয়
হিমাংশু

2
@ হিমাংশু: কারণ পিএইচপি সংখ্যাকে অষ্টাল হিসাবে 0 দিয়ে শুরু করে ব্যাখ্যা করে। সুতরাং 012
ইয়াছির আরাফাত মজুমদার

49

হ্যাঁ, কোনও stdClassবস্তু অ্যারে-কাস্টিংয়ের মাধ্যমে এটি সম্ভব :

$data =  new stdClass;
$data->{"12"} = 37;
$data = (array) $data;
var_dump( $data );

এটি আপনাকে দেয় (পিএইচপি সংস্করণ 7.1 পর্যন্ত):

array(1) {
  ["12"]=>
  int(37)
}

(আপডেট: আমার আসল উত্তরটি ব্যবহার করে আরও জটিল উপায় দেখিয়েছে json_decode()এবং json_encode()এটি প্রয়োজনীয় নয়))

মন্তব্যটি দ্রষ্টব্য : দুর্ভাগ্যক্রমে সরাসরি মানটি উল্লেখ করা সম্ভব নয়: $data['12']ফলে একটি নোটিশ প্রকাশিত হবে।

আপডেট :
পিএইচপি 7.২ থেকে এর মান উল্লেখের জন্য কী হিসাবে একটি সংখ্যাযুক্ত স্ট্রিং ব্যবহার করা সম্ভব:

var_dump( $data['12'] ); // int 32

2
স্ট্রিং কী সহ মানটির সরাসরি অ্যাক্সেস কাজ করে না, যদিও। আপনার উদাহরণ এই লাইন যোগ করুন echo $data['12'];। এটি ত্রুটিটি দেবে, "বিজ্ঞপ্তি: অপরিবর্তিত অফসেট: 12 ইন - লাইন 5"।
এলএস

1
যখন আপনি লারাভেল ডিডি ব্যবহার করবেন ($ তথ্য) এটি ক্র্যাশ হয়ে যাবে: পি
কামিল কিয়েসজেউস্কি

2
পিএইচপি 7.2.0RC2 এ আচরণটি আগের মতোই ছিল।
dev0

1
সম্ভবত array_key_existsএটি পুরানো সংস্করণগুলিতে খুঁজে পাবে না।
হবেন না

1
পিএইচপি 7.4
জেসমিনগুলিতে

12

আপনার যদি পিএইচপি ডেটা স্ট্রাকচারে একটি সংখ্যার কী ব্যবহার করতে হয় তবে একটি অবজেক্ট কাজ করবে। এবং অবজেক্টগুলি অর্ডার সংরক্ষণ করে, যাতে আপনি পুনরাবৃত্তি করতে পারেন।

$obj = new stdClass();
$key = '3';
$obj->$key = 'abc';

এটি একটি খুব ভাল পরামর্শ। আমি ফ্রেমওয়ার্ক কোডটি লিখছি এবং এমন একটি অ্যারে পাস করার সাথে মুখোমুখি হয়েছি যার "দুর্ঘটনাজনিত" সূচক হতে পারে: অ্যারে ('এই', 'যে') বা "সহযোগী" সূচক: অ্যারে (123 => অ্যারে ('এটি', ') '))। এখন, আপনাকে ধন্যবাদ, আমি কেবল টাইফিন্ট করতে পারি;) +1
জাস্ট প্লেইন হাই

কিন্তু পিএইচপি অ্যারেতে কী হিসাবে "123" এর মতো সংখ্যার স্ট্রিংটি কোনও পূর্ণসংখ্যায় রূপান্তরিত না করেই কী সম্ভব?
ফ্লিম

@ ফ্লাইম নং যা সম্ভব নয়, এ কারণেই আমি আমার সমাধানটি দিচ্ছি।
12

@ ফ্লিম যে উত্তরটি পিএইচপি ম্যানুয়ালটির বিরোধিতা করে বলে মনে হচ্ছে : বৈধ পূর্ণসংখ্যাযুক্ত স্ট্রিংগুলি পূর্ণসংখ্যার ধরণে ফেলে দেওয়া হবে। উদাহরণস্বরূপ কী "8" কী 8 টির নিচে সংরক্ষণ করা হবে অন্যদিকে "08" beালাই করা হবে না, কারণ এটি কোনও বৈধ দশমিক পূর্ণসংখ্যা নয়। যদিও আমি তার উত্তর পরীক্ষা করিনি।
13

এই বাক্যটি "এর সাথে নির্দিষ্ট করা বিভাগের অধীনে রয়েছে array(), সুতরাং আমি ধরে নিচ্ছি যে সেই প্রসঙ্গে বৈধ পূর্ণসংখ্যার উল্লেখ করে স্ট্রিংগুলি পূর্ণসংখ্যার ধরণে প্রেরণ করা হবে। তবে দেখা যাচ্ছে যে অ্যারে তৈরির অন্যান্য উপায় রয়েছে, যেখানে এটি ঘটে না, যেমন ডেভিড এর উত্তর, যা আমি পরীক্ষা আছে হিসাবে।
Flimm

10

আমার কাজটি হ'ল:

$id = 55;
$array = array(
  " $id" => $value
);

স্পেস চর (প্রিপেন্ড) একটি ভাল সমাধান কারণ আন্তঃ রূপান্তর রাখুন:

foreach( $array as $key => $value ) {
  echo $key;
}

আপনি 55 এর মতো হিসাবে দেখতে পাবেন।


4
বা "0$id" => $value0কাজ করেও প্রস্তুতি নিচ্ছে ।
নওফাল

সুতরাং আপনি বলছেন যে পিএইচপি অ্যারেতে কী হিসাবে "123" এর মতো সংখ্যার স্ট্রিংটি কোনও পূর্ণসংখ্যায় রূপান্তরিত করা ছাড়া সম্ভব নয়?
ফ্লিম

5

আপনি স্ট্রিংয়ের কীটি টাইপকাস্ট করতে পারেন তবে পিএইচপি-র শিথিল-টাইপিংয়ের কারণে এটি শেষ পর্যন্ত পূর্ণসংখ্যায় রূপান্তরিত হবে। নিজের জন্য দেখুন:

$x=array((string)123=>'abc');
var_dump($x);
$x[123]='def';
var_dump($x);

পিএইচপি ম্যানুয়াল থেকে:

একটি কী কোনও হয় পূর্ণসংখ্যা বা স্ট্রিং। যদি কোনও কীটি কোনও পূর্ণসংখ্যার মানক উপস্থাপনা হয় তবে এর অর্থ ব্যাখ্যা করা হবে (অর্থাত "8" 8 হিসাবে ব্যাখ্যা করা হবে, "08" "08" হিসাবে ব্যাখ্যা করা হবে)। কী-তে থাকা ফ্ল্যাটগুলি পূর্ণসংখ্যার সাথে কাটা হয়। ইনডেক্সড এবং এসোসিয়েটিভ অ্যারে প্রকারগুলি পিএইচপিতে একই ধরণের, যা উভয়ই পূর্ণসংখ্যা এবং স্ট্রিং সূচকগুলি ধারণ করতে পারে।


1
রুপান্তর আলগা টাইপিংয়ের কারণে নয়; পিএইচপি নির্ধারণ করে যে স্ট্রিংটি সংখ্যাসূচক দেখাচ্ছে এবং তারপরে এটি রূপান্তর করে।
জ্যাক

1
তাহলে আপনি কি বলছেন যে এটা সম্ভব নয়? এই উত্তরটি দেখায় যে একটি স্ট্রিং ব্যবহার করার একটি উপায় রয়েছে যা কোনও অ্যারের কী হিসাবে পূর্ণসংখ্যার মতো লাগে।
ফ্লিম

সমস্যাটি হ'ল পিএইচপি ইন্টারপ্রেটার। এমন একটি ভাষা কল্পনাও করা সম্ভব নয় যা অ্যারে কী হিসাবে স্ট্রিং এবং পূর্ণসংখ্যার মিশ্রিত করে। সবচেয়ে ভালো সমাধান? Undolog দ্বারা প্রস্তাবিত হিসাবে stackoverflow.com/a/15413637/1977778 সবচেয়ে ভালো সমাধান একটি trailing স্থান ব্যবহার করা ... দুঃখজনকভাবে।
সেন্তেঞ্জা

@ এসটেঞ্জা: এটি কল্পনা করা সম্ভব, বিশেষত যেহেতু পিএইচপি একটি অ্যারের কী হিসাবে স্ট্রিং এবং পূর্ণসংখ্যার মিশ্রণের অনুমতি দেয়:[42 => 'answer', 'snafu' => 'fubar']
এলএস

@ এলএস হ্যাঁ আমি জানি যে পিএইচপি আপনাকে এটি করার অনুমতি দেয়, তবে আপনি যদি অনুমানমূলক জেনেরিক টাইপ সিস্টেমের মধ্যে কীগুলি বিবেচনা করেন তবে এটি একই সাথে স্ট্রিং এবং সংখ্যাগুলিকে আলিঙ্গিত কোনও মিশ্র টাইপের সাথে মেলে না । আলগা টাইপিং একটি মিশুক অ্যারে কি প্রয়োগ কেবল প্রবণ ত্রুটি।
সেন্তেনজা

1

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

আমি যখন $data = array_merge($data, $extra);পিএইচপি ব্যবহার করতাম তখন কীগুলি 'পুনরায় অর্ডার করত'। ক্রম করছেন একটি প্রয়াস, পূর্ণসংখ্যা কি-সংকলন (আমি চেষ্টা 6- '6'- "6"এমনকি (string)"6"চাবি হিসাবে) 0 থেকে নতুন নামকরণ পেয়েছিলাম n... আপনি এটি সম্পর্কে যদি মনে বেশিরভাগ ক্ষেত্রেই এই কাঙ্ক্ষিত আচরণ হবে।

$data = $data + $extra;পরিবর্তে ব্যবহার করে আপনি এটিকে ঘিরে কাজ করতে পারেন । বেশ সোজা এগিয়ে, তবে আমি প্রথমে এটির কথা ভাবিনি ^^


ঠিক একই সমস্যাটি আমাকে এই পৃষ্ঠায় নিয়ে গেছে, তবে আমাকে বলতে হবে যে এটি ওপির প্রশ্নের উত্তর নয়।
ফ্লিম

@ ফ্লিম ট্রু তবে উত্তর অনুসন্ধানে আমাকে এই পৃষ্ঠায় নিয়ে গেছে। আমি বুঝতে পারি আমার সমাধান অন্যান্য গুগলারের জন্য সহায়ক হতে পারে :)
ব্রেইনফিডার

1

বৈধ পূর্ণসংখ্যাযুক্ত স্ট্রিংগুলি পূর্ণসংখ্যার ধরণে ফেলে দেওয়া হবে। উদাহরণস্বরূপ কী "8" কী 8 টির নিচে সংরক্ষণ করা হবে অন্যদিকে "08" beালাই করা হবে না, কারণ এটি কোনও বৈধ দশমিক পূর্ণসংখ্যা নয়।

ভুল

আমার একটি কাস্টিং ফাংশন রয়েছে যা এসোসিয়েটিভ অ্যারে কাস্টিংয়ের অনুক্রমকে পরিচালনা করে,

$array_assoc = cast($arr,'array_assoc');

$array_sequential = cast($arr,'array_sequential');

$obj = cast($arr,'object');

$json = cast($arr,'json');



function cast($var, $type){

    $orig_type = gettype($var);

    if($orig_type == 'string'){

        if($type == 'object'){
            $temp = json_decode($var);
        } else if($type == 'array'){
            $temp = json_decode($var, true);
        }
        if(isset($temp) && json_last_error() == JSON_ERROR_NONE){
            return $temp;
        }
    }
    if(@settype($var, $type)){
        return $var;
    }
    switch( $orig_type ) {

        case 'array' :

            if($type == 'array_assoc'){

                $obj = new stdClass;
                foreach($var as $key => $value){
                    $obj->{$key} = $value;
                }
                return (array) $obj;

            } else if($type == 'array_sequential'){

                return array_values($var);

            } else if($type == 'json'){

                return json_encode($var);
            }
        break;
    }
    return null; // or trigger_error
}

পিএইচপি 7.4
জেসমিনগুলি

1

কার্যকারণ হিসাবে, আপনি JSON_FORCE_OBJECT বিকল্পের সাথে, পিএইচপি অ্যারেটিকে জসন বস্তুতে এনকোড করতে পারেন।

যেমন, এই উদাহরণ:

     $a = array('foo','bar','baz');
     echo "RESULT: ", json_encode($a, JSON_FORCE_OBJECT);

ফলাফল হবে:

     RESULT: {"0" : "foo", "1": "bar", "2" : "baz"}

0

আমি '0' এবং '' উভয়ই কী হিসাবে এই অ্যারেতে এই সমস্যায় পড়েছি। এর অর্থ হ'ল আমি আমার অ্যারে কীগুলি == বা === দিয়ে চেক করতে পারি না।

$array=array(''=>'empty', '0'=>'zero', '1'=>'one');
echo "Test 1\n";
foreach ($array as $key=>$value) {
    if ($key == '') { // Error - wrongly finds '0' as well
        echo "$value\n";
    }
}
echo "Test 2\n";
foreach ($array as $key=>$value) {
    if ($key === '0') { // Error - doesn't find '0'
        echo "$value\n";
    }
}

Workaround হ'ল অ্যারে কীগুলি ব্যবহারের আগে স্ট্রিংগুলিতে ফিরে যেতে হবে।

echo "Test 3\n";
foreach ($array as $key=>$value) {
    if ((string)$key == '') { // Cast back to string - fixes problem
        echo "$value\n";
    }
}
echo "Test 4\n";
foreach ($array as $key=>$value) {
    if ((string)$key === '0') { // Cast back to string - fixes problem
        echo "$value\n";
    }
}

1
এটি আসলে প্রশ্নের উত্তর নয়।
ফ্লিম

0

@ ডেভিড সমাধান সম্পর্কে, দয়া করে মনে রাখবেন যে আপনি যখন সহযোগী অ্যারেতে স্ট্রিংয়ের মানগুলি অ্যাক্সেস করার চেষ্টা করবেন তখন সংখ্যাগুলি কাজ করবে না not আমার অনুমান যে এগুলি পর্দার পিছনে পূর্ণসংখ্যায় কাস্ট করা হয় (অ্যারে অ্যাক্সেস করার সময়) এবং কোনও মান খুঁজে পাওয়া যায় না। পূর্ণসংখ্যা হিসাবে মানগুলি অ্যাক্সেস করা কোনও কাজ করে না। তবে আপনি মানগুলি পেতে বা অ্যারেটি পুনঃব্যবহার করতে অ্যারে_শিফ্ট () ব্যবহার করতে পারেন।

$data = new stdClass;
$data->{"0"} = "Zero";
$data->{"1"} = "One";
$data->{"A"} = "A";
$data->{"B"} = "B";

$data = (array)$data;

var_dump($data);
/*
Note the key "0" is correctly saved as a string:
array(3) {
  ["0"]=>
  string(4) "Zero"
  ["A"]=>
  string(1) "A"
  ["B"]=>
  string(1) "B"
}
*/

//Now let's access the associative array via the values 
//given from var_dump() above:
var_dump($data["0"]); // NULL -> Expected string(1) "0"
var_dump($data[0]); // NULL (as expected)
var_dump($data["1"]); // NULL -> Expected string(1) "1"
var_dump($data[1]); // NULL (as expected)
var_dump($data["A"]); // string(1) "A" (as expected)
var_dump($data["B"]); // string(1) "B" (as expected)

কোন পিএইচপি সংস্করণ? আমি ঠিক আপনার উদাহরণ চেষ্টা এবং কী "0"হয়ে 0পিএইচপি সঙ্গে 7.2.10
জে.বিজমাই

-1

একটি অ্যারে বাছাই করার চেষ্টা করার সময় আমার এই সমস্যা হয়েছিল যেখানে আমাকে হেক্স শ 1 হতে সারণি কী প্রয়োজন। যখন ফলস্বরূপ sha1 মানটির কোনও অক্ষর না থাকে, পিএইচপি কীটি পূর্ণসংখ্যায় পরিণত করে। তবে স্ট্রগুলির আপেক্ষিক ক্রমে আমার অ্যারে বাছাই করা দরকার। সুতরাং আমার বাছাই করার ক্রম পরিবর্তন না করে কীটিকে স্ট্রিং হিসাবে চাপিয়ে দেওয়ার জন্য একটি উপায় খুঁজে বের করতে হবে।

এএসসিআইআই চার্টের দিকে ( https://en.wikedia.org/wiki/ASCII ) উদ্দীপনা বিন্দুটি স্থানের প্রায় একই রকম এবং অবশ্যই সমস্ত সংখ্যা এবং বর্ণের চেয়ে কম।

সুতরাং আমি কী স্ট্রিংয়ের শেষে একটি বিস্ময়বোধক পয়েন্ট যুক্ত করেছি।

for(...) {

    $database[$sha.'!'] = array($sha,$name,$age);
}

ksort($database);
$row = reset($database);
$topsha = $row[0];

সুতরাং আপনি কি বলছেন যে পিএইচপি অ্যারেতে কী হিসাবে "123" এর মতো সংখ্যার স্ট্রিংটি কোনও পূর্ণসংখ্যায় রূপান্তরিত করা সম্ভব নয়?
ফ্লিম

না - এটি কেবল কীসোর্ট () ব্যবহার করে অ্যারে বাছাই করার সময় সমস্ত সংখ্যার সাথে থাকা সমস্ত কীটি বিবেচনা করে - এটি কখনই পূর্ণসংখ্যায় রূপান্তরিত হয় না - বাছাইয়ের সময় যেমন এক হিসাবে তুলনা করা হয়।
শুক্রবার 18
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.