簡體   English   中英

在函數內部時in_array似乎不起作用

[英]in_array does not seem to work while inside a function

我有此代碼,將檢查數組包含特定的字符串並輸出所需的數據,但是它在函數內部,因此使用串聯“。=”完成輸出,我確實嘗試了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,因此不顯示任何內容,我嘗試使用非數組變量對其進行了測試,並且其工作正常,因此我猜想數組在函數內部無法正常工作嗎? 如果我在這里錯了,請糾正我。 我需要此功能的陣列才能使任何想法的人工作?

謝謝 :)

in_array()在函數內部正常工作,但是您期望它搜索子字符串,但不會。 如果要搜索firstName<br> ,它將找到您要查找的內容,因為您將firstName<br>添加到了數組中,但是firstName不在數組中。

乍一看,我所看到的只是你.<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'];
}

然后嘗試一下。

您是否嘗試過in_array('firstName<br>') 在填充數組時,在此處的值中添加一個break標記: $show[] = $row['field_name']."<br>"; ...

順便說一句:用一會兒代替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/zh/function.vsprintf.php

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

現在,該代碼已經過測試,也不知道您想在哪里使用像我提供的解決方案那樣的解決方案,所以請不要以為這是一個完全驗證的,隨時可以使用的代碼。

記得:

“調試是一開始編寫代碼的兩倍。因此,如果您盡可能聰明地編寫代碼,那么就定義而言,您就不夠聰明,無法對其進行調試。” —布賴恩·克尼根(Brian Kernighan)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM