2015-12-16 3 views
2

Я извлекаю список разрешений из БД и помещаю их в массив;Поиск массива, хранящегося в сеансе

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. Синтаксис выглядит корректно для меня.

+2

'array_search' не ищет рекурсивный. – Daan

+0

array_search соответствует входу элементам массива. Вы ищете строку в массиве, который не содержит строк, содержит другие массивы, которые, в свою очередь, содержат строки. Так что это не сработает. – pvg

+0

Разве это не var_dump, который добавляет эти биты? – Nathan

ответ

2

Ваша проблема заключается в том, что вы добавляете всю строку (которая является собственным массивом) из вашей базы данных в файл $_SESSION['permissions'] -array, образуя под-массив для каждого повторного итерации значений из базы данных.

Это означает, что все значения в $_SESSION['permissions'] являются массивами, а не строками. Это, в свою очередь, означает, что вы не можете найти такую ​​строку.

Если вы сохранили значение интересующие вас, в колонке под названием permissions в базе данных, вам нужно просто добавить этот элемент только к вашему $_SESSION['permissions'] -array, как этот

$_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, если вы можете.

+0

Если вы не используете PHP 5.4.x или ниже. Но 'Это расширение устарело от PHP 5.5.0 и было удалено с PHP 7.0.0.' –

+0

Это утверждение, что вы должны остановить *, если можете *, просто потому, что функции' mysql_' устарели. Большинство людей имеют хотя бы PHP 5.5, если вы находитесь на более низкой версии, это само по себе может быть разумным аргументом для изменения хоста. Но это не проблема здесь ;-) – Qirel

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

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 показывается пустой.

Смежные вопросы