Php 这个数组的所有元素都是相同的,但是为什么呢?

Php 这个数组的所有元素都是相同的,但是为什么呢?,php,arrays,Php,Arrays,我有一些代码,可以循环遍历一个数组以及该数组中的一个数组,并创建一个所有项的列表。输出的列表将用于制作菜单 在将数据添加到$new\u items之前,echo的格式为: Lane Financial Literacy IDA Required 然而,在foreach的末尾,如果我转储$new\u items,我希望它是一样的。但事实并非如此: IDA Required IDA Required IDA Required 似乎$new\u items数组正在添加每个项,但值被最后添加的元素覆

我有一些代码,可以循环遍历一个数组以及该数组中的一个数组,并创建一个所有项的列表。输出的列表将用于制作菜单

在将数据添加到
$new\u items
之前,echo的格式为:

Lane
Financial Literacy
IDA Required
然而,在foreach的末尾,如果我转储
$new\u items
,我希望它是一样的。但事实并非如此:

IDA Required
IDA Required
IDA Required
似乎
$new\u items
数组正在添加每个项,但值被最后添加的元素覆盖

变量在添加到
$new\u项目之前看起来是正确的,但是它们在哪里更改?

这是我的密码:
$new_items=array();
foreach($loc类){
//克隆原始项,更改给定值,使其适合我们的类
$loc_项目=$menu_项目[$key];
$loc_item->ID=新建_类_菜单_ID();
$loc\u item->url=site\u url(sprintf('/?post\u type=product&class location=%s',urlencode($loc['term']->slug));
$loc_item->title=$loc['term']->name.$loc['class_count'.'”;
//$loc\u item->menu\u item\u parent//保留位置的原始菜单父项。
echo“位置名称:{$loc_item->title}\n”//#####
$new_items[]=$loc_item;
foreach($loc['categories']作为$cat){
$cat_item=$menu_items[$key];
$cat_item->ID=new_class_menu_ID();
$cat_item->url=site_url(sprintf('/?post_type=product&class位置=%s&product_cat=%s),urlencode($loc['term']->slug),urlencode($cat['term']->slug));
$cat_item->title=$cat['term']->name.'.$cat['class_count'.';
$cat\u item->menu\u item\u parent=$loc\u item->ID;//类别应嵌套在其位置下
echo“类别名称:{$cat_item->title}\n”//#####
$new_items[]=$cat_item;
}
回显“新项目:\n”;/######调试”#####
foreach($i=>$item形式的新_项)回显“item{$i}:{$item->title}\n”/#####调试#####
回显“\n\n\n”//#####调试#####
}
函数新建\u类\u菜单\u id(){
静态$i=1000;
$i++;
返回$i;
}
调试输出:
位置名称:车道1
类别名称:金融知识1
类别名称:IDA必需1
新项目:
项目0:所需IDA 1
项目1:所需国际开发协会1
项目2:所需国际开发协会1
预期产出:
项目0:车道1
项目1:金融知识1
项目2:所需国际开发协会1

答案非常简单-因为您只能处理一个对象($menu\u items[$key])

看看我的例子来理解:

 $items = array();
 $object = new stdClass();

 $object->title = 'test1';

 $items[] = $object;
 var_dump($items);  // title is 'test1'

 $object->title = 'test2';
 var_dump($items); // now title is 'test2'

您不是在克隆对象,而是在传递引用并覆盖类成员。例如,如果您尝试以下代码:

<?
class SomeClass {
 public $ID;
 public $url;
 public $title;

 function __construct() {
  $this->ID = 1;
  $this->url = "www.stackoverflow.com";
  $this->title = "MyTitle";
 }
}

$key=0;
$menu_items[$key] = new SomeClass();

// As the object has been constructed, the ID=1
var_dump($menu_items[$key]);

$loc_item = $menu_items[$key];
$loc_item->ID = 2;

// changed in loc_item var, that refers to the same instance
var_dump($menu_items[$key]);

?>

您将看到$menu_items[$key]在第一个var_转储中的ID=1,在$loc_item中更改后的ID=2


如果您想采用这种方法,也许应该实现这里描述的克隆方法:

这很有意义。我可能在PHP4中也做了同样的事情,显然在默认情况下做了一个副本。不过我不确定。无论如何,只要在对象修复所有问题之前粘贴
clone
关键字即可!天才!非常感谢。我的用法:
$loc_item=clone$menu_items[$key]谢谢你的解释,现在就有意义了。我不知道对象是通过引用传递的。虽然我在回答@lpg,因为他也提供了解决方案(克隆
关键字)。
Item 0: Lane <span class="class-count">1</span>
Item 1: Financial Literacy <span class="class-count">1</span>
Item 2: IDA Required <span class="class-count">1</span>
 $items = array();
 $object = new stdClass();

 $object->title = 'test1';

 $items[] = $object;
 var_dump($items);  // title is 'test1'

 $object->title = 'test2';
 var_dump($items); // now title is 'test2'
<?
class SomeClass {
 public $ID;
 public $url;
 public $title;

 function __construct() {
  $this->ID = 1;
  $this->url = "www.stackoverflow.com";
  $this->title = "MyTitle";
 }
}

$key=0;
$menu_items[$key] = new SomeClass();

// As the object has been constructed, the ID=1
var_dump($menu_items[$key]);

$loc_item = $menu_items[$key];
$loc_item->ID = 2;

// changed in loc_item var, that refers to the same instance
var_dump($menu_items[$key]);

?>