在函数内部,in_array似乎不起作用

时间:2012-03-20 16:45:40

标签: php arrays

我有这个代码,将检查数组包含特定的字符串并输出所需的数据,但它是在一个函数内,因此输出是使用连接“。=”完成的,我确实尝试了基本的in_array函数形成 即

$show = array();
$show[] = "dog";
$show[] = "doga";
$show[] = "dogasd";
$show[] = "cat asd";
print_r($show);
if(in_array("cat asd", $show))
{
echo "found";
}
else
{
echo "not found";
}

它正在运作,但在这里:

public function personal(){

            $sql_field = "SELECT * FROM somewhere WHERE show_field = 1";
    $result = mysql_query($sql_field);
    $num = mysql_num_rows($result);

    $show = array();
    for($i=0;$i<$num;$i++)
    {
        $row = mysql_fetch_assoc($result);
        $show[] = $row['field_name']."<br>";
    }

            $block .= "<tr>";
    $block .= $show[0];

        if(in_array("firstName", $show))
        {
            $block .= "<td style=\"width: 250px;\"><div class=\"fields\"><input type=\"text\" title=\"First Name*\" value=\"{$this->detail("firstName")}\" name=\"first_name\" class=\"placeholder textbox-long\" /></div></td>";
        }
        if(in_array("lastName", $show))
        {
            $block .= "<td style=\"width: 250px;\"><div class=\"fields\"><input type=\"text\" title=\"Last Name*\" value=\"{$this->detail("lastName")}\" name=\"last_name\" class=\"placeholder textbox-long\" /></div></td>";
        }
    $block .= "</tr>";

    }

它总是输出false因此没有显示任何东西,我尝试使用非数组变量并且它工作正常,所以我的猜测是数组在函数内部效果不佳?如果我错了,请纠正我。我需要数组才能使用此功能  任何想法的家伙?

谢谢你:)

3 个答案:

答案 0 :(得分:4)

in_array()在函数内部工作得很好,但是你期望它搜索一个子字符串,它不会这样做。如果您要搜索firstName<br>,那么在您向数组中添加firstName<br>之后,它会找到您要查找的内容,但firstName不在数组中。

答案 1 :(得分:3)

乍一看,我只能看到你.<br>的最终结果可能是阻止它找到确切的短语。

变化:

for($i=0;$i<$num;$i++)
{
    $row = mysql_fetch_assoc($result);
    $show[] = $row['field_name']."<br>";
}

为:

for($i=0;$i<$num;$i++)
{
    $row = mysql_fetch_assoc($result);
    $show[] = $row['field_name'];
}

然后试一试。

答案 2 :(得分:1)

你试过in_array('firstName<br>')吗?在填充数组时,您可以在此处为值添加break标记:$show[] = $row['field_name']."<br>"; ...

顺便说一下:用while替换foreach,它更好......诚实!

按要求

以下是我的写作方式:

$sql_field = "SELECT * FROM somewhere WHERE show_field = 1";//I'd only select the fields I needed
$result = mysql_query($sql_field);
//$result holds the resource, not the actual array
//That's why you can do this:
$show = array();
$firstName = $lastName = '';//in_array is slow, so store the values seperatly
while ($row = mysql_fetch_assoc($result))
{
     $show[] = $row['field_name'].'<br/>';
     //I'm a bit of a nitpicker, but should be <br/> :-)
     if ($row['field_name'] === 'firstName')
     {
         $firstName = '<td style="width: 250px;"><div class="fields"><input type="text" title="First Name*" value="'.$this->detail("firstName").'" name="first_name" class="placeholder textbox-long" /></div></td>';
         //use single quotes, a little faster, and less backslashes
     }
     if ($row['fieldName'] ==='lastName')
     {
         $lastName = '<td style="width: 250px;"><div class="fields"><input type="text" title="Last Name*" value="'.$this->detail("lastName").'" name="last_name" class="placeholder textbox-long" /></div></td>';
     }
}//while ends when all results have been fetched
$block .='<tr>'.$show[0].$firstName.$lastName.'</tr>';

这样,如果未返回名字和姓氏,则字符串为空。结果是一样的。一个更好的解决方案就是制作一个数组$temp=array('firstName'=>'','lastName'=>'');并做一些类似的事情

if($temp[$row['fieldName']])
{
    $temp[$row['fieldName']] = '<td style="width: 250px;"><div class="fields"><input type="text" title="'.ucfirst(substr($row['fieldName'],0,-4)).' Name*" value="'.$this->detail($row['fieldName']).'" name="'.substr($row['fieldName'],0,-4).'_name" class="placeholder textbox-long" /></div></td>';
}

或者你可以使用(v)sprintf ......你的选择是无限的。

更多信息:

http://www.php.net/while

http://www.php.net/mysql_fetch_assoc(例子!)

在其中一个页面上,您可以找到解释为何在这种情况下更好的原因。

如果你想要C风格的字符串格式:

http://www.php.net/manual/en/function.vsprintf.php

http://www.functions-online.com/

此代码现在已经过测试,我也不知道你想在哪里使用我给出的解决方案,所以请不要认为这是一个完全可以使用的代码。

记住:

“调试的难度是首先编写代码的两倍。因此,如果您尽可能巧妙地编写代码,那么根据定义,您可能不够聪明,无法对其进行调试。” - Brian Kernighan