使用代码解释此问题更简单。请注意,函数位于不同的文件中,并且包含在页面中。
$announcements = $dbc->query($q)->results(); //Returns array of objects
$announcements = prepareMessage($announcements); //Adds html tags to values
$latest = $announcements[0]; //Assign first index to variable
$announcements = truncate($announcements); //Truncate announcement text
function prepareMessage($message) {
foreach($message as $values => $key) {
$key->title = '<h2>'.$key->title.'</h2>';
$key->name = '<p>'.$key->name.'</p>';
$key->date = '<small>'.humanDate($key->date).'</small>';
}
return $message;
}
function truncate($message) {
foreach($message as $values => $key) {
$key->announcement = substr($key->announcement, 0, 50) . '...</p>';
}
return $message;
}
运行此行代码后,$ latest变量的值发生了变化
$announcements = truncate($announcements);
$ line之前的最新值
[announcement] =>
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod
tempor incididunt ut labore et dolore magna aliqua.
运行该行后的最新值
[announcement] =>
Lorem ipsum dolor sit amet, consectetur adipisc...
所以我的问题是,为什么最新的价值会发生变化?
答案 0 :(得分:3)
因为$latest
是$announcements[0]
的引用,而不是$announcements[0]
的实际值。相反,请使用clone
。在PHP5中,object assignments are always by reference。
$latest = clone $announcements[0]; //Clone first object in array
答案 1 :(得分:2)
也许这个例子可以帮助您理解为什么$ latest正在发生变化:
如你的代码中所述,$ announcements是一个对象数组,简化如下:
$test = array(new StdClass(array('a'=>1)));
$latest = $test[0];
$test[0]->a = 3;
var_dump($latest);
var_dump会显示$ latest也已更改。这是因为实际上$ test [0]只是对StdClass实例的引用,并且该实例被复制到$ latest。当实例更改时,对实例的两个引用都将显示来自同一实例的相同值。
答案 2 :(得分:0)
您正在使用代码中的truncate函数将$ latest的值减少到50个字符。
要获得$ latest的完整价值,请使用以下代码:
$announcements = $dbc->query($q)->results(); //Returns array of objects
$announcements = prepareMessage($announcements); //Adds html tags to values
$latest = $announcements[0]; //Assign first index to variable
function prepareMessage($message) {
foreach($message as $values => $key) {
$key->title = '<h2>'.$key->title.'</h2>';
$key->name = '<p>'.$key->name.'</p>';
$key->date = '<small>'.humanDate($key->date).'</small>';
}
return $message;
}
或者您可以更改此行显示的字符数量(其中&#34; 50&#34;是要显示的字符数量,&#34; 0&#34;是从哪里开始)
$key->announcement = substr($key->announcement, 0, 50) . '...</p>';