【问题标题】:PHP/SQL array access errorPHP/SQL 数组访问错误
【发布时间】:2015-11-09 08:21:45
【问题描述】:

我正在尝试用 PHP 中的 SQL 查询的结果创建一个新列:

$someArray= array(array('match'=>'123'), array('match'=>'456'), array('match'=>'789')); //arbitrary number of elements
foreach($someArray as $key=>$item){
    $someArraysDouble[]=$item;
}
$someQuery="select count(*) as somecount from sometable";
$probe1=array();
$probe2="0";
$probe3="0";
$probe4="0";
$servername = "localhost";
$username = "username";
$password = "password";
$dbname = "myDB";//myDB uses MySQL
$conn = new mysqli($servername, $username, $password, $dbname);
if ($conn->connect_error) {
    die("Connection failed: " . $conn->connect_error);
}
foreach($someArray as $key=>$item) {
    $someQuery.=" where somecolumn like "%$item['match']%";
    $blahblah=$conn->query($someQuery);
    if ($blahblah->num_rows > 0) {
        while($row = $result->fetch_assoc()) {
            $row['match']=$item['match'];
            $probe1[]=$row;
        }
    }
    $conn->close();
}
foreach($someArraysDouble as $key1=>$item1) {
    foreach($probe1 as $key2=>$item2) {
        if($item2['match']==$item1['match']) {
            $probe2=$item1['somecount'];
            $probe3=$item2['somecount'];
            $item1['somecount']=$item2['somecount'];
            $probe4=$item1['somecount'];
        }
    }
}

输出的 HTML 如下所示:

<html>
<head></head>
<body>
{$probe2}<br>{$probe3}<br>{$probe4}<br><br>
{loop $probe1 $key1 $item1}
{$item1['somecount']}<br><br>
{/loop}
<br><br>
{loop $someArraysDouble $key2 $item2}
{$item2['somecount']}<br><br>
{/loop}
</body>
</html>

结果是……我不明白的东西:
- $probe2 为空,这是预期的。
- $probe3 是最后一个元素的计数值,这是预期的。
- $probe4 是最后一个元素的计数值,这是预期的。
- 第一个 loop$probe1 生成每个元素的计数值,这是预期的。
- 带有$someArraysDouble 的第二个loop 不会产生任何结果,这是意料之外的。这怎么会发生?

出于某种我没有分享的原因,为了使这个问题保持简洁,我需要通过$someArraysDouble 输出每个元素的计数值。

【问题讨论】:

  • 代码着色显示错误,$someQuery.=" where somecolumn like "%$item['match']%"; 括号的数量/类型不匹配。试试:$someQuery.=" where somecolumn like '%$item['match']%' ";
  • $someArray 是在哪里生成的..?

标签: php mysql arrays sorting


【解决方案1】:

我怀疑这条线没有像你预期的那样执行,因为你在进入循环之前没有创建$someArraysDouble

$someArraysDouble[]=$item;

先尝试创建一个空数组,如下所示:

$someArraysDouble = array(); // <== Initialize the array first

$someArray = array(array('match'=>'123'), array('match'=>'456'), 
               array('match'=>'789')); //arbitrary number of elements   
foreach($someArray as $key=>$item){
  $someArraysDouble[] = $item;
}

请参阅PHP Array docs 了解更多信息,特别是“使用方括号语法创建/修改”部分。

【讨论】:

  • 几个月后,我设法自己解决了这个问题。还是谢谢。
  • 你应该发布你的答案。其他人可能会遇到此问题。
  • 那里。发表了我的答案。
【解决方案2】:

原来是我不明白 foreach 在 PHP 中的工作原理。

function array_generate(){
return array(array('match'=>'123'), array('match'=>'456'), array('match'=>'789')); //arbitrary number of elements
}
$someArray=array_generate();
var_dump($someArray);
foreach($someArray as $heavy=>$load)
{
    $load['addedvalue']="newvalue";
    $test1[$heavy]="newvalue";
    $test2[$heavy]=$load['addedvalue'];
    var_dump($someArray);
}
var_dump($someArray);
var_dump($test2);

n+2 var_dump($someArray)s(其中 n==count($someArray))都显示相同。

array(3) { [0]=> array(1) { ["match"]=> string(3) "123" } [1]=> array(1) { ["match"]=> string(3) "456" } [2]=> array(1) { ["match"]=> string(3) "789" } }

但是var_dump($test2) 显示:

array(3) { [0]=> string(8) "newvalue" [1]=> string(8) "newvalue" [2]=> string(8) "newvalue" }

这意味着$someArray 的每个元素的addedvalue$key 更改后不会持续存在。所以我的解决方案是使用一个新数组,它与原始数组在长度上同步。

【讨论】:

    猜你喜欢
    • 2010-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-11
    • 2011-09-13
    • 1970-01-01
    • 2015-07-28
    • 2012-10-31
    相关资源
    最近更新 更多