PHP में foreach के बिना key और value के साथ array को implode कैसे करें


111

बिना फॉर्च्यूनर के , मैं इस तरह से एक सरणी कैसे मोड़ सकता हूं

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

इस तरह एक स्ट्रिंग के लिए

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

मैंने implode()पहले से ही इसके बारे में सोचा था , लेकिन यह इसके साथ कुंजी को निहित नहीं करता है।

यदि यह आवश्यक है, तो क्या यह संभव नहीं है कि घोंसले का शिकार न हो?

संपादित करें: मैंने स्ट्रिंग बदल दी है


EDIT2 / UPDATE: यह प्रश्न काफी समय पहले पूछा गया था। उस समय, मैं एक पंक्ति में सब कुछ लिखना चाहता था, इसलिए मैं फ़ॉरेस्ट के पक्ष में फ़ंक्शन कॉल में निर्मित टर्नरी ऑपरेटरों और घोंसले का उपयोग करूंगा। यह एक अच्छा अभ्यास नहीं था! कोड लिखें जो पठनीय है, चाहे वह संक्षिप्त हो या न हो, इससे कोई फर्क नहीं पड़ता।

इस मामले में: एक फ़ंक्शन में फ़ॉर्च को रखना एक लाइनर लिखने की तुलना में बहुत अधिक पठनीय और मॉड्यूलर होगा (भले ही सभी उत्तर महान हों!)।


नेस्टेड नेरीस्टेड नेचर कैसे होगा?
शुभम

आप क्या प्रयास कर रहे हैं? आपके पास वे अड़चनें क्यों हैं?
का भूत

यह वेब ऐप आई बिल्डिंग के लिए मेरा डेटाबेस क्लास था, मैं इसे गन्दा नहीं देखना चाहता क्योंकि यह पहले से ही सभी के साथ-साथ
फॉर्चून

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 का उपयोग करने के लिए बेहतर होगा। एक्ज़िबिट A: willem.stuursma.name/2010/11/22/…
केस

यहाँ कोई भी लिंक अब काम नहीं कर echo "Hello, World!";रहा है, मुझे उन सभी कार्यों के कोड उदाहरण देखने चाहिए?
फेलिक्स गगनोन-ग्रेनियर

खुद की मांग के अनुसार अनुकूलित करने के लिए यह विधि बहुत आसान है।
कबीर हुसैन

मैं चुनिंदा विकल्पों के निर्माण और चयनित विकल्प को पॉप्युलेट करने के लिए इस पद्धति का उपयोग कर रहा था, और चूंकि दोनों सरणियों का आकार समान होना चाहिए, इसलिए आप दूसरे सरणी के लिए ऐसा कुछ कर सकते हैं। array_fill(0, $input, 'selected-value-you want-to-check-against');यह सभी पंक्तियों के लिए एकल मूल्य के साथ एक ही आकार का सरणी उत्पन्न करेगा।
krasenslavov

187

आप इस तरह 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
स्ट्रिंग एन्कोडिंग से सावधान रहें! यदि आप एक URL का निर्माण नहीं कर रहे हैं, तो शायद आप इसे अपनी सरणी कुंजी और मान पर नहीं चाहते हैं
Matteo

8
@Matteo आप लपेट कर सकते हैं http_build_queryमें urldecodeयह से बचने के लिए।
Afterlame

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 बेंच दूसरों से तुलनात्मक होने के लिए urld timecode गायब है।
निकल- २ nick ’१

एक अन्य विकल्प:substr(str_replace('"', '', json_encode($headers)), 1, -1);
निकल-

1
चेतावनी: अगर इसमें जगह है तो यह आपके मूल्यों को बदल देता है। http_build_queryप्लस (के साथ रिक्त स्थान को बदल देता है +) चरित्र।
एरफुन

9

मैं उपयोग करूंगा serialize()या json_encode()

हालांकि यह आपके इच्छित परिणाम स्ट्रिंग को नहीं देगा, लेकिन बाद में इसे एन्कोड / स्टोर / पुनः प्राप्त / डीकोड करना बहुत आसान होगा।


3

Array_walk का उपयोग करना

$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
मुझे array_walk दृष्टिकोण पसंद है, लेकिन मुझे समझ नहीं आता कि लोग create_functionगुमनाम फ़ंक्शन का उपयोग करने के बजाय केवल उपयोग करने का सुझाव क्यों देते हैं ?
रिक्की

@ रिक्की संगतता!
शिप्पू मोकादिम

आह! मुझे नहीं पता था कि यह एक PHP4 बात थी!
रिक्की

@ रिक्की नं । इसके पूर्व PHP 5.3 बात। बेनामी फंक्शन सबसे पहले PHP 5.3
Shiplu Mokaddim

लेकिन इसे PHP 4.0.1 में पेश किया गया था, इसलिए यह PHP4 चीज है। शब्दार्थ ... एक मामूली संस्करण अद्यतन में अनाम कार्यों के रूप में महत्वपूर्ण के रूप में एक विशेषता जोड़ना विचित्र है।
रिक्की

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, ",");

मैं समझता हूं कि यह हर बार एक फॉर्च लूप लिखने का एक वैध विकल्प है। UPVOTED;)
गिल

2

डिबगिंग उद्देश्यों के लिए। पुनरावर्ती एक स्ट्रिंग के लिए नेस्टेड सरणियों की एक सरणी लिखता है। इस्तेमाल किया गया। फंक्शन राष्ट्रीय भाषा के पात्रों को संग्रहीत करता है।

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

आप PHP के array_reduce का भी उपयोग कर सकते हैं ,

$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 और print_r अधिक सामान्यतः डिबग आउटपुट प्रिंट करने के लिए जाना जाता है, लेकिन दोनों फ़ंक्शन इसके बजाय एक स्ट्रिंग वापस करने के लिए एक वैकल्पिक तर्क ले सकते हैं।

डेटा के रूप में प्रश्न से उदाहरण का उपयोग करना।

$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सरणी को स्ट्रिंग में बदलने के लिए उपयोग करना

जो वेरिएबल के php स्ट्रिंग प्रतिनिधित्व को आउटपुट करेगा।

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

उत्पादन होगा:

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

क्योंकि यह वैध php है हम इसका मूल्यांकन कर सकते हैं।

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

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