#php #arrays #wordpress #function #loops
#php #массивы #wordpress #функция #петли #циклы
Вопрос:
Я запускаю цикл $array
, в который я включаю только результаты, которые имеют соответствующую роль пользователя (от пользователей WordPress).
У меня есть цикл:
// custom function that returns the user's role (administrator, reader, etc)
$userRole = get_current_user_role();
foreach( $location_array as $key => $location ) {
if( in_array( $userRole, $location['c'] ) ) {
// do the things
echo '<div style="width: calc( 100vw / ' . count($array) . ');">';
echo $location['a'];
echo '</div>';
}
}
С $array
составлением:
Array (
[1] => Array (
[a] => Location 1
[b] => loc04
[c] => Array ( [administrator] => administrator )
)
[2] => Array (
[a] => Location 2
[b] => loc23
[c] => Array ( [administrator] => administrator, [publisher] => publisher )
)
[3] => Array (
[a] => Location 3
[b] => loc12
[c] => Array ( [publisher] => publisher, [viewer] => viewer )
)
)
Однако, когда я пытаюсь получить количество $array
, оно возвращает количество всех $key
, и я не знаю, как сузить его до только тех, которые из in_array( $userRole, $location['c']
Я попытался поместить in_array( $userRole, $location['c']
из цикла в переменную, а затем вывести ее, но у меня не было никакого успеха, кроме возврата значения 1, но для администратора было два совпадения
Комментарии:
1. «когда я пытаюсь получить количество
$array
» — Где вы это делаете? Пожалуйста, покажите нам весь соответствующий код, что содержат все переменные и каким должен быть результат и что вы получаете в данный момент.2. Вы понимаете, что мы понятия не имеем, что
$array
содержит, верно?3. @MagnusEriksson добавил использование count
4. Вы добавили код, который у вас есть
count($array)
, но поскольку это единственная ссылка на эту переменную в вашем коде, мы понятия не имеем, что она содержит, как она определяется и заполняется или чтоcount($array)
должно возвращаться.5.
$array
Сначала вам нужно отфильтровать в соответствии с вашей ролью, а затем вы можете использоватьcount
и повторять все, что захотите. Вы не можете просто запустить echo перед циклом, если хотите отфильтровать часть элемента. Я предполагаю, что$location_array
и$array
совпадают?
Ответ №1:
Вы не можете использовать count для текущего массива. Сначала вам нужно отфильтровать его!
Вы можете использовать array-filter как:
$arr = [["b" => "loc04", "c" => ["administrator" => "administrator"]]];
$arr[] = ["b" => "loc23", "c" => ["administrator" => "administrator", "publisher" => "publisher"]];
$arr[] = ["b" => "loc12", "c" => ["publisher" => "publisher", "viewer" => "viewer"]];
$role = "administrator";
$a = array_filter($arr, function ($e) use ($role) {return in_array($role, $e["c"]);});
Теперь $a
будет содержать 2 элемента.
Если ключ совпадает со значением, вам лучше использовать isset
(быстрее — O (1) вместо O (n)) как:
$a = array_filter($arr, function ($e) use ($role) {return isset($e["c"][$role]);});
Затем вы можете просто выполнить цикл $a
и сделать:
foreach($a as $location) {
echo '<div style="width: calc( 100vw / ' . count($a) . ');">';
echo $location['a'];
echo '</div>';
}
Живой пример: 3v4l