2013-09-23 79 views
6

Tôi có một mảng có nhiều đối tượng (nói 3 đối tượng), mỗi đối tượng có 3 cặp "Khóa-giá trị".Thay thế đối tượng bên trong một mảng trong php

$PredefinedResult là một cái gì đó như thế này:

[ 
    { 
     "EffectiveStatusId":0, 
     "EffectiveStatus":"abc", 
     "RecordCount":0 
    }, 
    { 
     "EffectiveStatusId":0, 
     "EffectiveStatus":"def", 
     "RecordCount":0 
    }, 
    { 
     "EffectiveStatusId":0, 
     "EffectiveStatus":"ghi", 
     "RecordCount":0 
    } 
] 

Tôi có một mảng các đối tượng tên là $MainResult với các giá trị như:

[ 
    { 
     "EffectiveStatusId":1, 
     "EffectiveStatus":"abc", 
     "RecordCount":7 
    }, 
    { 
     "EffectiveStatusId":6, 
     "EffectiveStatus":"def", 
     "RecordCount":91 
    } 
] 

Kết quả dự kiến:

Tôi muốn thay thế các đối tượng tương tự bên trong $PredefinedResult với các đối tượng từ $MainResult và muốn kết quả như thế này:

[ 
    { 
     "EffectiveStatusId":1, 
     "EffectiveStatus":"abc", 
     "RecordCount":7 
    }, 
    { 
     "EffectiveStatusId":6, 
     "EffectiveStatus":"def", 
     "RecordCount":91 
    }, 
    { 
     "EffectiveStatusId":0, 
     "EffectiveStatus":"ghi", 
     "RecordCount":0 
    } 
] 

gì tôi đã cố gắng:

Tôi đã thử với mã này, nhưng nó không đem lại cho tôi những kết quả mong muốn.

$FinalResult = array_replace($PredefineResult,$MainResult); 

Mọi người có thể giúp tôi cách lấy kết quả mong đợi như đã đề cập ở trên không?

+0

Đó là JSON. Bạn có thực sự giải mã nó trước đây không? –

+0

@AmalMurali: Không, tôi vừa định dạng nó để mọi người có thể xem kết quả mà tôi muốn. Trên thực tế nó là một mảng của các đối tượng. –

Trả lời

2

Không có chức năng "tích hợp sẵn" cho việc này. Bạn sẽ phải lặp lại và so sánh từng cách thủ công. array_map có vẻ như một sự lựa chọn OK ở đây:

$PredefinedResult = array_map(function($a) use($MainResult){ 
    foreach($MainResult as $data){ 
     if($a->EffectiveStatus === $data->EffectiveStatus){ 
      return $data; 
     } 
    } 
    return $a; 
}, $PredefinedResult); 

DEMO: http://codepad.viper-7.com/OHBQK8

+0

cảm ơn cho phát lại nó hoạt động ...... –

+0

Vui vì tôi có thể giúp :) –

+0

Trình diễn không còn truy cập được nữa. –

2

Lặp lại qua mảng và thủ công so sánh các giá trị như sau.

$res = array(); 
foreach ($PredefineResult as $result){ 
    foreach ($MainResult as $mresult){ 
     if(($result->EffectiveStatus == $mresult->EffectiveStatus) && $mresult->RecordCount!=0){ 
      $res[] = $mresult; 
     }else $res[] = $result; 
    } 
} 
print_r($res); 
+0

Tôi không nghĩ rằng điều này sẽ được làm việc. Bạn có thể giải thích cho tôi cách 'array_unique()' sẽ chỉ chọn đối tượng với 'RecordCount! = 0'? Xem kết quả tôi muốn là đối tượng với 'RecordCount == 0' sẽ được thay thế bằng' RecordCount! = 0'. –

+1

Dường như khóa của bạn là 'EffectiveStatus' cho mỗi mảng. Sau đó, bạn phải đi với foreach(); Hãy để tôi cập nhật câu trả lời của tôi cho phù hợp. – Jeyasithar

+0

Tôi đã chỉnh sửa câu trả lời của mình. Hy vọng điều này hoạt động. – Jeyasithar