কীভাবে পিএইচপি-তে পূর্বাভাস ছাড়াই কী এবং মান সহ অ্যারে ইমপ্লোড করবেন


111

পূর্বাভাস ব্যতীত আমি কীভাবে এইভাবে একটি অ্যারে ঘুরিয়ে দিতে পারি

array("item1"=>"object1", "item2"=>"object2",......."item-n"=>"object-n");

এই মত একটি স্ট্রিং

item1='object1', item2='object2',.... item-n='object-n'

আমি implode()ইতিমধ্যে ভেবেছিলাম , তবে এটি দিয়ে কীটি প্ররোচিত হবে না।

যদি ভবিষ্যদ্বাণী করা প্রয়োজন হয়, তাহলে কি ভবিষ্যদ্বাণী বাসা বাঁধাই সম্ভব নয়?

সম্পাদনা: আমি স্ট্রিং পরিবর্তন করেছি


সম্পাদনা 2 / আপডেট: এই প্রশ্নটি বেশ কিছুক্ষণ আগে জিজ্ঞাসা করা হয়েছিল। সেই সময়ে, আমি সমস্ত কিছু এক লাইনে লিখতে চেয়েছিলাম তাই আমি টেরিনারি অপারেটর এবং ফাংশন কলগুলিতে বাসা বাঁধে ফোরচের পক্ষে ব্যবহার করব। এটি একটি ভাল অনুশীলন ছিল না! কোডটি পাঠযোগ্য যা তা সংক্ষিপ্ত হোক বা না থাকুক তা লিখুন।

এক্ষেত্রে: ফাংশনে ভবিষ্যদ্বাণী স্থাপন করা ওয়ান-লাইনার লেখার চেয়ে অনেক বেশি পঠনযোগ্য এবং মডুলার হবে (যদিও সমস্ত উত্তর দুর্দান্ত!)।


নেস্টারেড নেচারারি হবে কীভাবে?
শুভম

আপনি কি চেষ্টা করছেন? কেন আপনার এই বাধা আছে?
মাদারার ঘোস্ট

এটি যে ওয়েব অ্যাপটি তৈরি করছি তার জন্য এটি আমার ডেটাবেস ক্লাস, আমি এটি অগোছালো দেখতে চাই না কারণ এটি ইতিমধ্যে একগুচ্ছ
পূর্বাচ

1
এই নির্বাচিত উত্তরটি এমন একটি পদ্ধতি যা আপনি জিজ্ঞাসা করেছিলেন, তবে এটি অবশ্যই লক্ষ্য করা উচিত যে এটি গুরুতরভাবে ধীরে ধীরে এবং আপনি যদি একটি ডেটাবেসের মাধ্যমে এই তথ্যটি সংরক্ষণ করেন তবে এটি কেবল একটি লুপ এবং উভয়ই json_encode ব্যবহারের জন্য যথেষ্ট উন্নত। প্রদর্শনী এ: willem.stuursma.name/2010/11/22/…
কেস

উত্তর:


187

এবং অন্য উপায়:

$input = array(
    'item1'  => 'object1',
    'item2'  => 'object2',
    'item-n' => 'object-n'
);

$output = implode(', ', array_map(
    function ($v, $k) {
        if(is_array($v)){
            return $k.'[]='.implode('&'.$k.'[]=', $v);
        }else{
            return $k.'='.$v;
        }
    }, 
    $input, 
    array_keys($input)
));

বা:

$output = implode(', ', array_map(
    function ($v, $k) { return sprintf("%s='%s'", $k, $v); },
    $input,
    array_keys($input)
));

6
এই পদ্ধতিটি লেখক যা যা চেয়েছিলেন তা হ'ল তবে এটি অবশ্যই লক্ষ্য করা উচিত যে এটি সমালোচনামূলকভাবে ধীর গতিযুক্ত এবং আপনি যদি একটি ডেটাবেসের মাধ্যমে এই তথ্যটি সংরক্ষণ করেন তবে এটি কেবল একটি লুপ এবং উভয়ই json_encode ব্যবহারের চেয়ে বিস্তৃততর হতে পারে। প্রদর্শনী এ: willem.stuursma.name/2010/11/22/…
কেস

এখানে লিঙ্কগুলির কোনওটিই আর কাজ করছে বলে মনে হচ্ছে না, সেগুলি echo "Hello, World!";কি আমার সমস্ত ফাংশনগুলির কোড উদাহরণগুলি দেখতে পাওয়া উচিত?
ফলিক্স গ্যাগন-গ্রেনিয়ার

এই পদ্ধতিটি নিজের চাহিদা অনুযায়ী কাস্টমাইজ করা খুব সহজ।
কবির হোসেন

আমি নির্বাচিত বিকল্পগুলি তৈরি করতে এবং নির্বাচিত বিকল্পটি পপুলেট করার জন্য এই পদ্ধতিটি ব্যবহার করছিলাম এবং যেহেতু উভয় অ্যারে একই আকার হতে হবে আপনি দ্বিতীয় অ্যারের জন্য এর মতো কিছু করতে পারেন। array_fill(0, $input, 'selected-value-you want-to-check-against');এটি সমস্ত সারির একক মান সহ একই আকারের অ্যারে তৈরি করবে।
krasenslavov

186

আপনি http_build_query এর মতো ব্যবহার করতে পারেন :

<?php
  $a=array("item1"=>"object1", "item2"=>"object2");
  echo http_build_query($a,'',', ');
?>

আউটপুট:

item1=object1, item2=object2 

ডেমো


5
এর অন্যান্য প্যারামিটারগুলি কখনও ব্যবহার করেন নি http_build_query
শিপলু মোকাদ্দিম

16
+1 হ্যাঁ হ্যাঁ, আমি এর মতো সদ্ব্যবহারের সামান্য কৌতুক খুঁজে পেতে ভালোবাসি :)
বেন

8
স্ট্রিং এনকোডিং সম্পর্কে সাবধান! আপনি যদি কোনও ইউআরএল তৈরি না করে থাকেন তবে সম্ভবত আপনি এটি আপনার অ্যারে কী এবং
মাত্তিও

8
@Matteo আপনি মোড়ানো পারেন http_build_queryমধ্যে urldecodeএটি এড়ানো।
আফটারলেমে

3
প্রতিভা সমাধান। এম এস এস অ্যারের ডিবাগ আউটপুটটির জন্য আমার কেবল এটিই ছিল।
ডিক্সাস

33

আমি পরিমাপ ব্যয় করেছি (100000 পুনরাবৃত্তি), কোন এসোসিয়েটিভ অ্যারে আঠা সবচেয়ে দ্রুততম উপায়?

উদ্দেশ্য: এই বিন্যাসে 1,000 আইটেমের একটি লাইন পাওয়ার জন্য: "কী: মান, কী 2: মান 2"

আমাদের অ্যারে রয়েছে (উদাহরণস্বরূপ):

$array = [
    'test0' => 344,
    'test1' => 235,
    'test2' => 876,
    ...
];

এক নম্বর টেস্ট:

Http_build_query এবং str_replace ব্যবহার করুন :

str_replace('=', ':', http_build_query($array, null, ','));

1000 টি উপাদানকে ইমপ্লোড করার গড় সময়: 0.00012930955084904

দ্বিতীয় নম্বর টেস্ট:

ব্যবহার করুন array_map এবং কেন্দ্রীভূত :

implode(',', array_map(
        function ($v, $k) {
            return $k.':'.$v;
        },
        $array,
        array_keys($array)
    ));

1000 টি উপাদানকে ইমপ্লোড করার গড় সময়: 0.0004890081976675

তিন নম্বর টেস্ট:

ব্যবহারের array_walk এবং কেন্দ্রীভূত :

array_walk($array,
        function (&$v, $k) {
            $v = $k.':'.$v;
        }
    );
implode(',', $array);

1000 টি উপাদানকে ইমপ্লোড করার গড় সময়: 0.0003874126245348

চার নম্বর টেস্ট:

ভবিষ্যদ্বাণী ব্যবহার করুন :

    $str = '';
    foreach($array as $key=>$item) {
        $str .= $key.':'.$item.',';
    }
    rtrim($str, ',');

1000 টি উপাদানকে ইমপ্লোড করার গড় সময়: 0.00026632803902445

আমি উপসংহারে পৌঁছাতে পারি যে অ্যারে আঠালো করার সর্বোত্তম উপায় - http_build_query এবং str_replace ব্যবহার করুন


4
$s = ''; foreach ($array as $k=>$v) { if ($s !== null) { $s .= ','; } $s .= "{$k}:{$v}"; }অন্য সকলকে ছাড়িয়ে যায়।
ফ্লেশগ্রিন্ডার

1
অন্যদের সাথে তুলনামূলক হওয়ার জন্য http_build_query বেঞ্চটি urldecode অনুপস্থিত।
নিকেল-

আরেকটি বিকল্প:substr(str_replace('"', '', json_encode($headers)), 1, -1);
নিকেল-

1
সতর্কতা: এটিতে স্থান থাকলে এটি আপনার মান পরিবর্তন করে। http_build_queryপ্লাস (সঙ্গে স্পেস প্রতিস্থাপন +) অক্ষর।
এরফুন

9

আমি ব্যবহার করতে হবে serialize()বা json_encode()

যদিও এটি আপনার পছন্দসই ফলাফলের স্ট্রিং দেয় না, তবুও পরে এনকোড / সঞ্চয় / পুনরুদ্ধার / ডিকোড করা অনেক সহজ হবে।


3

অ্যারে_ওয়াক ব্যবহার করে

$a = array("item1"=>"object1", "item2"=>"object2","item-n"=>"object-n");
$r=array();
array_walk($a, create_function('$b, $c', 'global $r; $r[]="$c=$b";'));
echo implode(', ', $r);

IDEONE


1
আমি অ্যারে_ওয়াক অ্যাপ্রোচ পছন্দ করি তবে আমি বুঝতে পারি না কেন লোকেরা create_functionকেবল একটি বেনামি ফাংশন ব্যবহার না করে ব্যবহার করার পরামর্শ দেয়?
রিকি 4'14

@ রিককি সামঞ্জস্য!
শিপলু মোকাদ্দিম

আহ! আমি বুঝতে পারিনি যে এটি একটি পিএইচপি 4 জিনিস!
রিককি

@Rikki কোন । এর প্রাক পিএইচপি 5.3 জিনিস। বেনামে ফাংশনটি প্রথম পিএইচপি 5.3 এ উপস্থিত হয়েছিল
শিপলু মোকাদ্দিম

তবে এটি পিএইচপি 4.0.0 এ চালু হয়েছিল, তাই পিএইচপি 4 জিনিসও রয়েছে। শব্দার্থবিজ্ঞান ... একটি গৌণ সংস্করণ আপডেটে বেনাম ফাংশনগুলির মতো তাত্পর্যপূর্ণ বৈশিষ্ট্য যুক্ত করা উদ্ভট।
রিকি

2

পরিবর্তন

-    return substr($result, (-1 * strlen($glue)));
+    return substr($result, 0, -1 * strlen($glue));

আপনি যদি শেষ $ আঠালো ছাড়াই পুরো স্ট্রিংটিকে পুনরায় জীবিত করতে চান

function key_implode(&$array, $glue) {
    $result = "";
    foreach ($array as $key => $value) {
        $result .= $key . "=" . $value . $glue;
    }
    return substr($result, (-1 * strlen($glue)));
}

এবং ব্যবহার:

$str = key_implode($yourArray, ",");

আমি বুঝতে পারি যে প্রতিবার ফরচ লুপ লেখার এটি একটি বৈধ বিকল্প। আপলোড করা;)
টনি গিল

2

ডিবাগিং উদ্দেশ্যে। পুনরাবৃত্তকারী একটি স্ট্রিং নেস্টেড অ্যারেগুলির একটি অ্যারে লিখুন। ব্যবহৃত foreach। ফাংশন জাতীয় ভাষার অক্ষর সংরক্ষণ করে।

function q($input)
{
    $glue = ', ';
    $function = function ($v, $k) use (&$function, $glue) {
        if (is_array($v)) {
            $arr = [];
            foreach ($v as $key => $value) {
                $arr[] = $function($value, $key);
            }
            $result = "{" . implode($glue, $arr) . "}";
        } else {
            $result = sprintf("%s=\"%s\"", $k, var_export($v, true));
        }
        return $result;
    };
    return implode($glue, array_map($function, $input, array_keys($input))) . "\n";
}

2

আপনি পিএইচপি এর অ্যারে_ড্রেসও ব্যবহার করতে পারেন ,

$a = ['Name' => 'Last Name'];

function acc($acc,$k)use($a){ return $acc .= $k.":".$a[$k].",";}

$imploded = array_reduce(array_keys($a), "acc");

1

MySQL তৈরি করার জন্য যেখানে অ্যারে থেকে শর্তাবলী

$sWheres = array('item1'  => 'object1',
                 'item2'  => 'object2',
                 'item3'  => 1,
                 'item4'  => array(4,5),
                 'item5'  => array('object3','object4'));
$sWhere = '';
if(!empty($sWheres)){
    $sWhereConditions = array();
    foreach ($sWheres as $key => $value){
        if(!empty($value)){
            if(is_array($value)){
                $value = array_filter($value); // For remove blank values from array
                if(!empty($value)){
                    array_walk($value, function(&$item){ $item = sprintf("'%s'", $item); }); // For make value string type 'string'
                    $sWhereConditions[] = sprintf("%s in (%s)", $key, implode(', ', $value));
                }
            }else{
                $sWhereConditions[] = sprintf("%s='%s'", $key, $value);
            }
        }
    }
    if(!empty($sWhereConditions)){
        $sWhere .= "(".implode(' AND ', $sWhereConditions).")";
    }
}
echo $sWhere;  // (item1='object1' AND item2='object2' AND item3='1' AND item4 in ('4', '5') AND item5 in ('object3', 'object4'))

1

এছাড়াও var_export এবং মুদ্রণ_আর সাধারণত ডিবাগ আউটপুট মুদ্রণের জন্য বেশি পরিচিত তবে উভয় ফাংশন পরিবর্তে একটি স্ট্রিং ফিরিয়ে আনতে একটি alচ্ছিক যুক্তি নিতে পারে।

তথ্য হিসাবে প্রশ্ন থেকে উদাহরণ ব্যবহার করে।

$array = ["item1"=>"object1", "item2"=>"object2","item-n"=>"object-n"];

print_rঅ্যারেটিকে একটি স্ট্রিংয়ে পরিণত করতে ব্যবহার করে

এটি ভেরিয়েবলের একটি মানব পাঠযোগ্য উপস্থাপনা আউটপুট করবে।

$string = print_r($array, true);
echo $string;

আউটপুট দেবে:

Array
(
    [item1] => object1
    [item2] => object2
    [item-n] => object-n
)

var_exportঅ্যারেটিকে একটি স্ট্রিংয়ে পরিণত করতে ব্যবহার করে

যা ভেরিয়েবলের একটি পিএইচপি স্ট্রিং প্রতিনিধিত্ব করে।

$string = var_export($array, true);
echo $string;

আউটপুট দেবে:

array (
  'item1' => 'object1',
  'item2' => 'object2',
  'item-n' => 'object-n',
)

কারণ এটি বৈধ পিএইচপি আমরা এটি মূল্যায়ন করতে পারি।

eval('$array2 = ' . var_export($array, true) . ';');
var_dump($array2 === $array);

আউটপুট:

bool(true)

0

ক্লাস ব্যবহার করে এখানে একটি সাধারণ উদাহরণ দেওয়া হল:

$input = array(
    'element1'  => 'value1',
    'element2'  => 'value2',
    'element3' =>  'value3'
);

echo FlatData::flatArray($input,', ', '=');

class FlatData
{

    public static function flatArray(array $input = array(), $separator_elements = ', ', $separator = ': ')
    {
        $output = implode($separator_elements, array_map(
            function ($v, $k, $s) {
                return sprintf("%s{$s}%s", $k, $v);
            },
            $input,
            array_keys($input),
            array_fill(0, count($input), $separator)
        ));
      return $output;
    }

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