搜索存储在Session中的数组

时间:2015-12-16 14:52:50

标签: php mysql

我从数据库中提取权限列表并将它们放入数组中;

while($row = mysql_fetch_assoc($get_permissions)) {
    $_SESSION['permissions'][] = $row;  
}    

会话变量的内容如下所示;

array(2) { 
    [0]=> array(1) { 
        ["permission_name"] => string(15) "acl_assets_read"
    } 
    [1]=> array(1) { 
        ["permission_name"] => string(16) "acl_assets_write" 
    } 
}

下面是使用print_r的输出,这使得它更容易阅读。

Array ( [0] => Array ( [permission_name] => acl_assets_read ) [1] => Array (     [permission_name] => acl_assets_write ) )

我已经阅读过有关使用array_search的信息并认为它应该可行。我尝试使用以下内容来搜索权限;

if (array_search('acl_assets_read', $_SESSION['permissions'])) {
    echo "true";   
}

我遇到的问题是,即使结果存在,它也会继续返回false。语法对我来说是正确的。

3 个答案:

答案 0 :(得分:2)

您的问题是您将整个行(它是一个自己的数组)从数据库添加到$_SESSION['permissions'] - 数组中,每次迭代数据库中的值时形成一个子数组。

这意味着$_SESSION['permissions']中的所有值都是数组,而不是字符串。这反过来意味着您无法搜索这样的字符串。

如果您已经存储了您感兴趣的值,则在数据库中名为permissions的列中,您只需将该元素添加到您的$_SESSION['permissions'] - 数组中,就像这样

$_SESSION['permissions'][] = $row['permissions'];  

这会将该行的字符串添加到数组$_SESSION['permissions']中的元素中。

还值得注意的是array_search()返回数组的,其中第一个元素的索引(键)将等于0.这意味着第一个元素你的数组看起来真的像if (0) { /* code */ }。这将返回false(if (0) == false),因此您应该考虑使用ìn_array(),它返回一个布尔true/false

if (in_array('acl_assets_read', $_SESSION['permissions'])) {
    echo "true";   
}

此外,mysql_*函数已弃用,如果可以的话,您可以stop using them

答案 1 :(得分:0)

array_search会对您有用,但您需要正确的array才能搜索。

看看这个:

$arrOne = array("one", "two");
$arrTwo = array(array("one"), array("two"));

$key = array_search("one", $arrOne);

var_dump($key); // int(0) is the index of where the value was found

$key = array_search("two", $arrTwo);

var_dump($key); // bool(false) because "two" != array("one") or array("two")

请注意,第二个array_search将返回false,因为string不等于array

如果你有:

array(2) { 
    [0]=> string(15) "acl_assets_read"
    [1]=> string(16) "acl_assets_write"
}

而不是:

array(2) { 
    [0]=> array(1) { 
        ["permission_name"] => string(15) "acl_assets_read"
    } 
    [1]=> array(1) { 
        ["permission_name"] => string(16) "acl_assets_write" 
    } 
}

然后您的array_search会找到合适的string

答案 2 :(得分:0)

这是你的答案:

$userdb = array(array("permission_name" => 'acl_assets_read'),array("permission_name" => 'acl_assets_write'));
$key = array_search("acl_assets_write", array_column($userdb, 'permission_name'));

if($key != ''){
  echo 'true';
}

如果针发现$ key显示针的关键。如果没有找到针,则$ key显示为空白。