2012-04-16 97 views
5

Tôi có một mảng mà trông như thế nàyCập nhật một mảng đa chiều trong PHP

$array = 
    Array 
    (
    [0] => Array 
     (
      [Product] => Amazing Widget 
      [Value] => 200 
     ) 

    [1] => Array 
     (
      [Product] => Super Amazing Widget 
      [Value] => 400 
     ) 

    [2] => Array 
     (
      [Product] => Promising Widget 
      [Value] => 300 
     ) 

    [3] => Array 
     (
      [Product] => Superb Widget 
      [Value] => 400 
     ) 
    } 

Tôi muốn cập nhật các mảng để thay đổi "triển vọng Widget" đến 800 thay vì 300.

Lưu ý rằng thứ tự của mảng này là tùy ý, có nghĩa là tôi cần phải cập nhật Giá trị Dựa trên giá trị tên "Sản phẩm" (không phải trên số của nó trong mảng).

Tôi đã cố gắng truy cập thông qua số trong mảng nhưng nhận ra rằng sẽ không hoạt động vì lý do đó và tôi không chắc chắn cách thay đổi giá trị của một phần tử của một mảng đa chiều dựa trên mảng khác.

Cảm ơn bạn đã được trợ giúp.

+0

hãy thử thao tác này .. thông qua và tìm kiếm sản phẩm mong muốn và lưu khóa của nó. Sau đó thay đổi giá trị được liên kết với khóa đó? – WordsWorth

+1

là bạn tạo mảng này, bạn có thể thay đổi cấu trúc không? – Alex

+1

Khi @Alex lưu ý, có thể tốt hơn nếu sử dụng băm với khóa là Tên sản phẩm. Mỗi mục nhập sẽ là một băm thuộc tính. –

Trả lời

5

Tôi nghĩ rằng bạn sẽ phải lặp qua họ, một cái gì đó như:

foreach ($array as $k => $v) { 
    if ($v['Product']=='Promising Widget') { 
    $array[$k]['Value']=800; 
    } 
} 
17
foreach($array as &$value){ 
    if($value['Product'] === 'Promising Widget'){ 
     $value['Value'] = 800; 
     break; // Stop the loop after we've found the item 
    } 
} 

Vì vậy, bạn lặp qua mảng, tìm giá trị mà bạn muốn, sau đó thay đổi nó. &$value là mảng được truyền theo tham chiếu. Có nghĩa là chúng ta có thể chỉnh sửa trực tiếp các giá trị trong mảng từ vòng lặp mà không cần phải thực hiện $array[$key]['Value'].

+0

Đánh bại tôi với nó, chính xác mã tương tự: o –

+0

Bạn nên thêm 'unset ($ value);' ở cuối, xem màu đỏ lớn đầu tiên ** Cảnh báo ** trong [foreach, hướng dẫn] (http: // php .net/manual/en/control-structures.foreach.php) –

1

Câu trả lời này có thể là quá muộn, nhưng tôi phải đối mặt với một vấn đề tương tự mà tôi giải quyết sử dụng chức năng này

function r_search_and_replace(&$arr) { 
    foreach ($arr as $idx => $_) { 
     if(is_array($_)) r_search_and_replace($arr[$idx]); 
     else { 
      if(is_string($_)) $arr[$idx] = str_replace("PATTERN", "REPLACEMENT", $_); 
     } 
    } 
} 
4

Tôi nghĩ rằng hầu hết cách tiếp cận phổ biến là sử dụng array_walk_recursive chức năng như thế:

array_walk_recursive($array, 'updateValue'); 

function updateValue(&$data, $key) { 
    if($key == 'Promising Widget') { 
    $data = 800; 
    } 
} 

Bằng cách này, ngay cả khi bạn sẽ thay đổi mảng của bạn sau này trên chức năng này vẫn sẽ làm việc tốt.

+0

chắc chắn không phải là 'cách tiếp cận phổ biến nhất'. Từ trang hướng dẫn sử dụng: 'Bất kỳ khóa nào chứa một mảng sẽ không được chuyển đến hàm. ' – CapelliC

Các vấn đề liên quan