2011-12-29 18 views
18

मैं दूसरे के साथ एक सरणी के कुछ मूल्य बदलने के लिए कुछ मानक PHP समारोह लिए देख रहा था में मूल्य की जगह है, लेकिन आश्चर्यजनक रूप से मैं किसी भी नहीं मिला है, इसलिए मैं अपने खुद के बारे में करने के लिए है:खोज और PHP सरणी

function array_replace_value(&$ar, $value, $replacement) 
{ 
    if (($key = array_search($ar, $value)) !== FALSE) { 
     $ar[$key] = $replacement; 
    } 
} 

लेकिन मुझे अभी भी आश्चर्य है - ऐसी आसान चीज़ के लिए पहले से ही इसके लिए कुछ फ़ंक्शन होना चाहिए! या मेरे द्वारा आविष्कार किए गए इस से कहीं अधिक आसान समाधान हो सकता है?

ध्यान दें कि यह फ़ंक्शन केवल एक प्रतिस्थापन करेगा। मैं मौजूदा समाधानों की तलाश में हूं जो समान रूप से एक घटना को प्रतिस्थापित करते हैं, साथ ही साथ सभी घटनाओं को प्रतिस्थापित करते हैं। टॉमस द्वारा

संपादित करें:

+0

ध्यान दें कि सरणी मूल्य से गुजरती हैं। आपको या तो फ़ंक्शन से नई सरणी वापस करने की आवश्यकता होगी (शेष 'array_ * 'फ़ंक्शंस के व्यवहार से मेल खाना) या संदर्भ में' array_replace_value' 'ar ar' लेना होगा। – outis

+0

[str_replace] (http://www.php.net/str_replace)() सरणी लेता है, लेकिन आप इसे एक प्रतिस्थापन तक सीमित नहीं कर सकते हैं। – goat

+0

धन्यवाद @outis, मुझे इस दौरान डीबगिंग के दौरान खुद को एहसास हुआ :) – TMS

उत्तर

15

जबकि वहाँ नहीं है एक समारोह बराबर नमूना कोड के लिए, आप एक ही बात को प्राप्त करने के array_keys (वैकल्पिक खोज मूल्य पैरामीटर के साथ), array_fill और array_replace उपयोग कर सकते हैं कोड काम नहीं कर रहा था, इसे सही किया गया:

$ar = array_replace($ar, 
    array_fill_keys(
     array_keys($ar, $value), 
     $replacement 
    ) 
); 
+0

'array_replace()' मान लीजिए कि आप पहले से ही चाबियाँ नहीं जानते हैं? ओपी मूल्य से खोज और प्रतिस्थापित करने के लिए देख रहा है। –

+0

'array_replace' कुंजी द्वारा प्रतिस्थापित करता है, मूल्य नहीं। – outis

+0

तो सबसे पहले आप कुंजी पा सकते हैं और फिर उस कुंजी को प्रतिस्थापित कर सकते हैं .. –

5

इस फ़ंक्शन को आज़माएं।

public function recursive_array_replace ($find, $replace, $array) { 
    if (!is_array($array)) { 
     return str_replace($find, $replace, $array); 
    } 

    $newArray = []; 
    foreach ($array as $key => $value) { 
     $newArray[$key] = recursive_array_replace($find, $replace, $value); 
    } 
    return $newArray; 
} 

चीयर्स!

+0

कृपया इसे अपने कार्य के अतिरिक्त के रूप में लें। यह बहु आयामी सरणी प्रक्रिया करता है। –

-1
<b>$green_key = array_search('green', $input); // returns the first key whose value is 'green' 

$ इनपुट [$ green_key] = 'सेब'; // की जगह 'सेब'

+0

यह मूल रूप से टॉमस के पास है, लेकिन यह उस मामले को संभाल नहीं करता है जहां सरणी में कोई मान मौजूद नहीं है। – outis

18
एक समारोह है कि केवल एक सरणी में एक मूल्य की घटनाओं की जगह के बजाय

साथ 'हरित', यहां और भी सामान्य array_map:

array_map(function ($v) use ($value, $replacement) { 
    return $v == $value ? $replacement : $v; 
}, $arr); 

का उपयोग कर एक से अधिक मान की अनेक गतिविधियां प्रतिस्थापित करने के लिए मूल्य की सरणी => प्रतिस्थापन:

array_map(function ($v) use ($replacement) { 
    return isset($replacement[$v]) ? $replacement[$v] : $v; 
}, $arr); 

एक मूल्य की एक एकल घटना की जगह के लिए, आपको array_search का उपयोग करेंगे के रूप में आप कर सकते हैं। चूंकि कार्यान्वयन इतना छोटा है, इसलिए PHP डेवलपर्स को कार्य करने के लिए मानक फ़ंक्शन बनाने का कोई कारण नहीं है। यह नहीं कहना है कि यदि आप खुद को अक्सर इसकी आवश्यकता महसूस करते हैं, तो ऐसा कोई फ़ंक्शन बनाने के लिए यह समझ में नहीं आता है।

+0

+1। अच्छा जवाब के लिए धन्यवाद, मुझे यह वाक्यविन्यास नहीं पता था, हालांकि मानचित्र और कस्टम कोड का उपयोग करना इसके लिए एक मजबूत उपकरण है - अक्षम हो सकता है? मैं राघव की तरह "हार्डकोडेड" समाधान पसंद करता हूं। – TMS

+0

@ टोमास: क्या वाक्यविन्यास आप [अज्ञात फ़ंक्शंस] (http://www.php.net/manual/en/functions.anonymous.php) और बंद करने का जिक्र कर रहे हैं? "उपयोग" विनिर्देशक के अतिरिक्त को छोड़कर, यह वाक्यविन्यास की तुलना में अधिक अर्थशास्त्र है। दक्षता के लिए, यदि कोई प्रभाव पड़ता है, तो यह नगण्य है (जब तक कि आप प्रत्येक अनुरोध के साथ हजारों सरणी पर प्रतिस्थापन नहीं कर रहे हों)। प्रदर्शन को प्रभावित करने वाला एक कारक यह है कि प्रत्येक 'array_ *' फ़ंक्शन पर कॉल एक अतिरिक्त सरणी बना देगा जिसके परिणामस्वरूप: यहां एक, राघव में तीन।हमेशा के रूप में, प्रोफाइलिंग प्रदर्शन का निर्धारण करने का सबसे अच्छा तरीका प्रोफाइलिंग है। – outis

+0

... ध्यान दें कि राघव के पास कुछ भी कठोर नहीं है जो ऐसा नहीं करता है, क्योंकि उनके पास समान मूल्य समान पैरामीटर (सरणी, प्रतिस्थापन मूल्य और प्रतिस्थापन मूल्य) हैं। हार्डकोडिंग कुछ भी शायद ही कभी एक उल्लेखनीय प्रदर्शन लाभ देता है, क्योंकि परिवर्तनीय लुकअप की लागत कम है। – outis

3

यदि प्रदर्शन एक मुद्दा है, तो कोई भी array_map() के भीतर कई फ़ंक्शन नहीं बनाने पर विचार कर सकता है। ध्यान दें कि isset() बेहद तेज़ है, और यह समाधान किसी अन्य कार्य को बिल्कुल कॉल नहीं करते हैं।

$replacements = array(
    'search1' => 'replace1', 
    'search2' => 'replace2', 
    'search3' => 'replace3' 
); 
foreach ($a as $key => $value) { 
    if (isset($replacements[$value])) { 
     $a[$key] = $replacements[$value]; 
    } 
} 
0

Deept Raghav के जवाब के आधार पर, मैं पालन समाधान है कि नियमित अभिव्यक्ति खोज करता है बनाया।

$arr = [ 
    'Array Element 1', 
    'Array Element 2', 
    'Replace Me', 
    'Array Element 4', 
]; 

$arr = array_replace(
    $arr, 
    array_fill_keys(
     array_keys(
      preg_grep('/^Replace/', $arr) 
     ), 
     'Array Element 3' 
    ) 
); 

echo '<pre>', var_export($arr), '</pre>'; 

PhpFiddle: http://phpfiddle.org/lite/code/un7u-j1pt

0

निर्भर करता है यह मूल्य, कुंजी है या दोनों आप चाहते हैं और आप पर की जगह कुछ इस तरह कर सकता करने के लिए:

$array = json_decode(str_replace($replace, $with, json_encode($array)), true); 

मैं यह नहीं कह रहा हूँ यह सबसे कुशल या सुरुचिपूर्ण है, लेकिन अच्छा और सरल है।

1

कॉलबैक के साथ array_walk() के बारे में क्या?

$array = ['*pasta', 'cola', 'pizza']; 
$search = '*'; 
$replace = '\*'; 
array_walk($array, 
    function (&$v) use ($search, $replace){ 
     $v = str_replace($search, $replace, $v);  
    }                  
); 
print_r($array); 
संबंधित मुद्दे