2011-12-29 75 views
18

tôi đang tìm kiếm một số chức năng PHP tiêu chuẩn để thay thế một số giá trị của một mảng với khác, nhưng đáng ngạc nhiên tôi đã không tìm thấy bất kỳ, vì vậy tôi phải viết của riêng tôi:tìm kiếm và thay thế giá trị trong PHP mảng

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

Nhưng tôi vẫn tự hỏi - cho một điều dễ dàng như vậy phải có một số chức năng cho nó! Hoặc có lẽ giải pháp dễ dàng hơn nhiều so với cái này được phát minh bởi tôi?

Lưu ý rằng chức năng này sẽ chỉ thực hiện một thay thế. Tôi đang tìm kiếm các giải pháp hiện có tương tự như thay thế một lần xuất hiện duy nhất, cũng như những thay thế tất cả các lần xuất hiện.

+0

Lưu ý rằng mảng được chuyển theo giá trị. Bạn sẽ cần phải trả về mảng mới từ hàm (khớp với hành vi của phần còn lại của các hàm 'mảng_ *') hoặc làm cho 'array_replace_value' lấy' $ ar' bằng tham chiếu. – outis

+0

[str_replace] (http://www.php.net/str_replace)() nhận mảng, nhưng bạn không thể giới hạn nó thành một thay thế. – goat

+0

Cảm ơn @outis, tôi đã tự nhận ra điều này khi đang gỡ lỗi trong thời gian chờ đợi :) – TMS

Trả lời

15

Trong khi có không phải là một chức năng tương đương với các mẫu mã, bạn có thể sử dụng array_keys (với tham số giá trị tìm kiếm tùy chọn), array_fillarray_replace để đạt được điều tương tự:

EDIT bởi Tomas: các mã không hoạt động, đã sửa chữa:

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

Không 'array_replace()' giả sử bạn đã biết các phím? OP đang tìm kiếm và thay thế bằng giá trị. –

+0

'array_replace' thay thế bằng khóa, không phải giá trị. – outis

+0

vì vậy đầu tiên bạn có thể tìm thấy chìa khóa và sau đó thay thế phím đó .. –

5

Hãy thử chức năng này.

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

Chúc mừng!

+0

Chỉ cần thực hiện điều này như là một bổ sung cho chức năng của bạn. Điều này xử lý mảng đa chiều. –

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

$ input [$ green_key] = 'apple'; // thay thế 'xanh' với 'táo'

+0

Điều này về cơ bản là những gì Tomas có, nhưng điều này không xử lý trường hợp một giá trị không có trong mảng. – outis

18

Thay vì một chức năng mà chỉ thay thế lần xuất hiện của một giá trị trong một mảng, có là tổng quát hơn array_map:

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

Để thay thế nhiều lần xuất hiện của nhiều giá trị sử dụng mảng giá trị => thay thế:

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

Để thay thế một lần xuất hiện của một giá trị, bạn sẽ sử dụng array_search như bạn. Do việc triển khai quá ngắn nên không có nhiều lý do để các nhà phát triển PHP tạo ra một hàm chuẩn để thực hiện nhiệm vụ. Không phải để nói rằng nó không có ý nghĩa để bạn tạo ra một chức năng như vậy, nếu bạn thấy mình cần nó thường xuyên.

+0

+1. cảm ơn outis cho câu trả lời tốt đẹp, tôi không biết cú pháp này, tuy nhiên bằng cách sử dụng bản đồ và mã tùy chỉnh là một công cụ mạnh mẽ cho việc này - có thể không hiệu quả? Tôi thích "hardcoded" giải pháp như của Raghav. – TMS

+0

@Tomas: là cú pháp bạn đang đề cập đến [chức năng ẩn danh] (http://www.php.net/manual/en/functions.anonymous.php) và đóng cửa? Ngoại trừ việc bổ sung các "sử dụng" specifier, đó là ngữ nghĩa hơn cú pháp. Đối với hiệu quả, nếu có một tác động, nó là không đáng kể (trừ khi bạn đang thực hiện thay thế trên có lẽ hàng ngàn mảng với mỗi yêu cầu). Một yếu tố ảnh hưởng đến hiệu suất là mỗi cuộc gọi đến một hàm 'array_ *' sẽ tạo ra một mảng bổ sung là kết quả của nó: một ở đây, ba trong Raghav's.Như mọi khi, hồ sơ là cách tốt nhất để xác định hiệu suất. – outis

+0

... Lưu ý rằng Raghav không có bất cứ điều gì mã hóa cứng mà điều này không, vì tất cả chúng đều có cùng giá trị paramaterized (mảng, giá trị để thay thế và giá trị thay thế). Hardcoding bất cứ điều gì hiếm khi cung cấp cho một lợi ích hiệu suất đáng chú ý, như chi phí tra cứu biến là nhỏ. – outis

3

Nếu hiệu suất là một vấn đề, người ta có thể xem xét không tạo nhiều chức năng trong phạm vi array_map(). Lưu ý rằng isset() cực kỳ nhanh và các giải pháp này không gọi bất kỳ chức năng nào khác.

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

Dựa trên câu trả lời của Deept Raghav, tôi đã tạo giải pháp theo dõi tìm kiếm biểu thức chính quy.

$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

Tùy thuộc cho dù đó là giá trị, chìa khóa hoặc cả hai bạn muốn tìm và thay thế trên bạn có thể làm một cái gì đó như thế này:

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

Tôi không nói rằng đây là hiệu quả nhất hoặc thanh lịch, nhưng đẹp và đơn giản.

1

Còn khoảng array_walk() có gọi lại?

$array = ['*pasta', 'cola', 'pizza']; 
$search = '*'; 
$replace = '\*'; 
array_walk($array, 
    function (&$v) use ($search, $replace){ 
     $v = str_replace($search, $replace, $v);  
    }                  
); 
print_r($array); 
Các vấn đề liên quan