Php 复制对象的最佳方式';s受保护成员';将数据存储到数组中
*在确定下划线问题后编辑了我的问题。Php 复制对象的最佳方式';s受保护成员';将数据存储到数组中,php,Php,*在确定下划线问题后编辑了我的问题。 非常感谢帮助诊断该问题的choz* *说明* 我有一个有两个成员的类,它们分别保存相册数据和照片数据。 在构造函数中,我使用从DB查询中提取的数据填充它们。 这些查询返回一个具有数组的对象,该数组是该对象的受保护成员 我试图向持有关联数组的对象中添加一个新的键和值,错误地将其视为一个数组。 未设置这些新键和值。可能是因为对象的数组成员受到保护。 请参见下面的var dump,其中对象转储以开始: [“数据”:受保护]。 这就是问题所在吗?如果是这样的话,如何
非常感谢帮助诊断该问题的choz* *说明* 我有一个有两个成员的类,它们分别保存相册数据和照片数据。 在构造函数中,我使用从DB查询中提取的数据填充它们。 这些查询返回一个具有数组的对象,该数组是该对象的受保护成员 我试图向持有关联数组的对象中添加一个新的键和值,错误地将其视为一个数组。 未设置这些新键和值。可能是因为对象的数组成员受到保护。 请参见下面的var dump,其中对象转储以开始: [“数据”:受保护]。 这就是问题所在吗?如果是这样的话,如何才能最好地创建我自己的副本,我可以自由操作
/****** Class Memebers ********/
//Object with array of associative album arrays.
//Each inner album array is defined by unique key ='albumID'.
private $member_albums;
//array of objects holding associative photo arrays.
//Each inner photo array is defined by unique key ='albumID'.
private $member_photos;
这是用于添加键和值的方法-
/*
* For each photo in each album, we will add a new key and value.
* key = 'img_url', value is an array with structure of
* ['S']['{url pointing to this photo in storage}'] where 'S' is the
* key (representing a string value) and value is the url string.
*/
private function add_Photo_Url_To_Photos_Data_Array(){
// If data was retrieved from DB without errors
// because query fail returns false.
if( $this->member_albums && $this->member_photos){
// If user has albums - because 'Count' is always 0 or
// greater, representing the number of inner arrays
if($this->member_albums['Count'] > 0 ){
// For number of albums
foreach ($this->member_albums['Items'] as $albumArr) {
// Current album ID
$curr_AlbumId = $albumArr['albumID']['S'];
// If current album contains photos
if( $this->member_photos[$curr_AlbumId]['Count'] > 0){
// For each photo in this album
foreach( $this->member_photos[$curr_AlbumId]['Items'] as &$photosArr) {
// method that creates a url from photo data- returns string url
$url = $this->build_Photo_Url($photosArr, $curr_AlbumId);
// Insert new key = 'img_url' and value into the array.
// new value is itself an array with key ['S']
// signifying a string and value $url
$photosArr['img_url'] = array('S' =>
$url);
// this echo shows key and value were added
// correctly into $photosArr
echo ' <br>Img URL = ' . $photosArr['img_url']['S'];
}
}
}
}
}
var\u dump($this->member\u photos)
Jay,在阅读所有注释并对您使用的
模型进行基本搜索后,您的对象支持toArray()
函数,该函数将以数组格式返回数据,而不包含受保护的
成员
以下是参考资料:
首先,尝试运行var_dump(get_class_方法($this->member_相册))
查看它将返回什么类型的方法。我确信有一个内置的toArray()
函数,主要是因为它是一个响应,所以它们可以让您轻松提取和操作数据
首先尝试var\u dump()
,然后尝试执行以下$clearArr=$this->member\u albums->toArray()
和print_r/var_dump$clearArr
,它将生成标准多维数组。您能分享数据库结果的结构吗?在$photosArr['img_url']=array('S'=>$url)之后的最后一个echo
上代码>。结果是什么?Img URL={正确的存储http地址}/{正确的存储桶名称}/{正确的用户id}/album_1/{正确的文件名}等等,我不明白你的问题。。哪一部分又出问题了?那么你的预期结果是什么呢?我相信这是因为你没有通过引用来循环成员相册。。所以这行foreach($this->member\u albums['Items']作为$albumArr){
应该是foreach($this->member\u albums['Items']作为&$albumArr){
object(Guzzle\Service\Resource\Model)#88 (2) {
["structure":protected]=> NULL ["data":protected]=> array(3) {
["Count"]=> int(2)
["Items"]=> array(2) {
[0]=> array(7) {
["PlaceLong"]=> array(1) { ["N"]=> string(1) "0" }
["AlbumId"]=> array(1) { ["S"]=> string(7) "album_1" }
["Title"]=> array(1) { ["S"]=> string(5) "Test1" }
["UserId"]=> array(1) { ["S"]=> string(36) "810725E5-D235-43F7-AA50-4CCDACD6AB36" }
["Year"]=> array(1) { ["N"]=> string(1) "0" }
["PlaceLat"]=> array(1) { ["N"]=> string(1) "0" }
["Timestamp"]=> array(1) { ["N"]=> string(16) "472572846.470462" }
}
array(2) {
["album_1"]=> object(Guzzle\Service\Resource\Model)#89 (2) {
["structure":protected]=> NULL ["data":protected]=> array(3) {
["Count"]=> int(5)
["Items"]=> array(5) {
[0]=> array(8) {
["ShotId"]=> array(1) { ["S"]=> string(6) "Photo2" }
["AlbumId"]=> array(1) { ["S"]=> string(7) "album_1" }
["UserId"]=> array(1) { ["S"]=> string(16) "1111-11111-11111" }
["Year"]=> array(1) { ["N"]=> string(1) "0" }
["Discovery"]=> array(1) { ["N"]=> string(1) "0" }
["Timpstamp"]=> array(1) { ["N"]=> string(14) "472572840.3845" }
["ExtractedPhotoId"]=> array(1) { ["S"]=> string(32) "Photo2_0-0-746-0-0-1000-746-1000" }
["ManualEdit"]=> array(1) { ["N"]=> string(1) "0" }
}