我有这个功能:
function coin_matrix($test, $revs) {
$coin = array();
for ($i = 0; $i < count($test); $i++) {
foreach ($revs as $j => $rev) {
foreach ($revs as $k => $rev) {
if ($j != $k &&
$test[$i][$j] != null &&
$test[$i][$k] != null) {
$coin[$test[$i][$j]][$test[$i][$k]] += 1 / ($some_var - 1);
}
}
}
}
return $coin;
}
,其中
$test = array(
array('3'=>'1','5'=>'1'),
array('3'=>'2','5'=>'2'),
array('3'=>'1','5'=>'2'),
array('3'=>'1','5'=>'1'));
和
$revs = array('3'=>'A','5'=>'B');
问题是,当我运行它时,它会返回这些错误(通知):
注意:未定义的索引:第10行的1
注意:未定义的索引:第10行的1
注意:未定义的索引:第10行的2
注意:未定义的索引:第10行的2
注意:未定义的索引:第10行的2
注意:未定义的索引:第10行的1
这一行:$coin[$test[$i][$j]][$test[$i][$k]] += 1 / ($some_var - 1);
问题是,最后函数返回正确的矩阵(数组),如果我测试是否存在$coin[$test[$i][$j]][$test[$i][$k]]
,那么它就不再返回它了。
非常感谢任何建议!
谢谢!
答案 0 :(得分:5)
$coin[$test[$i][$j]][$test[$i][$k]] += 1 / ($some_var - 1);
警告由+=
生成。 +=
需要在添加元素之前查找该元素,并且在您第一次访问元素时尚未初始化$coin
中的任何元素。
答案 1 :(得分:3)
您可以/应该测试以确保在递增值之前设置$coin[$test[$i][$j]][$test[$i][$k]]
。这不应该改变你的代码的功能,但会使通知消失(这是一个好习惯)。
function coin_matrix($test, $revs) {
$coin = array();
for ($i = 0; $i < count($test); $i++) {
foreach ($revs as $j => $rev) {
foreach ($revs as $k => $rev) {
if ($j != $k &&
$test[$i][$j] != null &&
$test[$i][$k] != null) {
// new tests go here
if(!isset(coin[$test[$i][$j]]))
{
coin[$test[$i][$j]] = array();
}
if(!isset(coin[$test[$i][$j]][$test[$i][$k]]))
{
coin[$test[$i][$j]][$test[$i][$k]] = 0;
}
$coin[$test[$i][$j]][$test[$i][$k]] += 1 / ($some_var - 1);
}
}
}
}
return $coin;
}
答案 2 :(得分:1)
我认为问题是你试图将$ coin用作二维数组。
如果你想要它是二维的,$ coin必须是一个数组数组。
function coin_matrix($test, $revs) {
$coin = array();
for ($i = 0; $i < count($test); $i++) {
foreach ($revs as $j => $rev) {
foreach ($revs as $k => $rev) {
if ($j != $k &&
$test[$i][$j] != null &&
$test[$i][$k] != null) {
// add this.
if ($coin[$test[$i][$j]] == null){
$coin[$test[$i][$j]] = array();
}
// end
$coin[$test[$i][$j]][$test[$i][$k]] += 1 / ($some_var - 1);
}
}
}
}
return $coin;
}
答案 3 :(得分:0)
我不太了解,但我可以建议你使用
function coin_matrix($test, $revs) {
$coin = array();
for ($i = 0; $i < count($test); $i++) {
foreach ($revs as $j => $rev) {
foreach ($revs as $k => $rev) {
if (($j != $k) &&
($test[$i][$j] != null) &&
($test[$i][$k] != null)) {
$coin[$test[$i][$j]][$test[$i][$k]] += 1 / ($some_var - 1);
}
}
}
}
return $coin;
}
答案 4 :(得分:0)
您是否考虑过使用foreach循环换出for循环? 例如:
foreach( $tests as $i => $test )
这样可以获得$ test [$ i]中的值。然后,在$test[ $i ][ $j ] == null
块中,将其放置:
if ($j != $k &&
// I suspect that this will cause errors too.
// Do yourself a favor and add this sanity check.
isset( $test[$j] ) && $test[$j] != null &&
isset( $test[$k] ) && $test[$k] != null) {
$currentK = $test[$k];
$currentJ = $test[$j];
// Use debug lines if setting things directly won't work
if( !isset( $coin[ $currentJ ] ) || !is_array( $coin[ $currentJ ] ) )
{
// $coin[ $currentJ ] = array();
die( "<pre>$currentK $currentJ \n" . print_r( $coin ) );
}
$currentCoin =& $coin[ $currentJ ];
if( !isset( $currentCoin [ $currentK ] ) ||
!is_array( $currentCoin [ $currentK ] ) )
{
// Just curious, but when doing these checks before,
// did you remember to assign a numeric value here?
//
// $currentCoin[ $currentK ] = 0;
die( "<pre>$currentK $currentJ \n" . print_r( $coin ) );
}
$currentCoin[ $currentK ] += 1 / ($some_var - 1);
}
}