Использование count($ array) для извлечения только соответствующего $ ключа

#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