У меня есть массив, и я пытаюсь получить только те имена, которые начинаются с «L» или «l», чтобы быть выведенными на экран.
$array = array('Leanna', 'nicole', 'Lisa', 'Sarah', 'Leopard', 'Michael', 'jack', 'logan');
foreach($array as $key => $value){
$exp_key = explode('L', $key);
if($exp_key[0] == 'L' || $exp_key[0] == "l"){
$arr_result[] = $value;
}
echo $value . "<br />";
}
но я все равно получаю все значения
Это код, который вы разместили в вопросе:
$array = array('Leanna', 'nicole', 'Lisa', 'Sarah', 'Leopard', 'Michael', 'jack', 'logan');
foreach($array as $key => $value){
$exp_key = explode('L', $key);
if($exp_key[0] == 'L' || $exp_key[0] == "l"){
$arr_result[] = $value;
}
echo $value . "<br />";
}
Как это устроено?
На первой итерации $key
установлен на номер 0
а также $value
это строка 'Leanna'
,
Заявление $exp_key = explode('L', $key);
новообращенные $key
в строку '0'
и разбивает его на массив строк, используя строку 'L'
в качестве разделителя. Так как нет L
внутри 0
, результатом является массив, который содержит только один элемент: входную строку (array(0 => '0')
). Как следствие, $exp_key[0]
это строка '0'
,
Согласно таблица свободных сравнений с использованием ==
, строка '0'
не равно ни тому, ни другому 'L'
ни 'l'
и утверждение внутри if
блок не выполняется.
echo $value
Оператор, однако, выполняется и печатает Leanna<br />
,
На следующем цикле $key
это число 1
а также $value
это строка 'nicole'
, Обработка работает аналогично первой итерации, сравнения дают тот же результат (false
) ничего не хранится в $arr_result
а также $value
печатается. То же самое происходит снова и снова, пока все элементы $array
обрабатываются.
Во-первых, вы не должны заботиться о ключах $array
, Это последовательные целые числа, начинающиеся с 0
и они бесполезны для цели.
Затем вы должны сравнить $value[0]
против прописных и строчных L
, Там нет необходимости explode()
все, что тебя волнует, это первый символ каждого значения.
Код может выглядеть так:
$array = array('Leanna', 'nicole', 'Lisa', 'Sarah', 'Leopard', 'Michael', 'jack', 'logan');
// Make sure $arr_result is always an array
// Cannot rely on the assignment inside the loop to initialize it because
// if no value in $array starts with 'L', the statement $arr_result[] = $value
// is never executed and at the end $arr_result is undefined.
$arr_result = array();
foreach ($array as $value) {
if ($value[0] == 'L' || $value[0] == 'l'){
$arr_result[] = $value;
}
}
print_r($arr_result);
Выход:
Array
(
[0] => Leanna
[1] => Lisa
[2] => Leopard
[3] => logan
)
Вы можете использовать функцию PHP array_filter()
извлечь из $array
только совпадающие значения:
$arr_result = array_filter(
$array,
function ($value) {
return strtoupper($value[0]) == 'L';
}
);
Это решение немного медленнее, чем циклическая обработка массива вручную, но оно более понятно. анонимная функция используется в качестве Перезвоните выполняет только сравнение (фильтрацию) и присваивание $arr_result
происходит только один раз, когда array_filter()
возвращается. Нет необходимости инициализировать $arr_result
больше, потому что array_filter()
всегда возвращает массив.
Вам нужно использовать $value
и не нужно explode()
, И ты повторял $value
который даст вам все значения, вам лучше использовать $arr_result
переменная:
<?php
$array = array('Leanna', 'nicole', 'Lisa', 'Sarah', 'Leopard', 'Michael', 'jack', 'logan');
foreach($array as $key => $value){
if($value[0] == 'L' || $value[0] == "l"){
$arr_result[] = $value;
}
}
print_r($arr_result);
?>
Выход:
Array
(
[0] => Leanna
[1] => Lisa
[2] => Leopard
[3] => logan
)
Вы можете использовать встроенную функцию array_map.
array_map — применяет обратный вызов к элементам данных массивов
$array = array('Leanna', 'nicole', 'Lisa', 'Sarah', 'Leopard', 'Michael', 'jack', 'logan');array_map("getEntries", $array);
function getEntries($e) {
if($e[0] == "L" || $e[0] == "l") {
echo $e;
}
}
explode (‘l’, $ arr) удаляет l из полученного массива
$arr_result=[];
$array = array('Leanna', 'nicole', 'Lisa', 'Sarah', 'Leopard', 'Michael', 'jack', 'logan');
foreach($array as $key => $value){
if($value[0] == 'L' || $value[0] == "l"){
$arr_result[] = $value;
}
echo $value . "<br />";
}
print_r($arr_result);
$array = array('Leanna', 'nicole', 'Lisa', 'Sarah', 'Leopard', 'Michael', 'jack', 'logan');
foreach($array as $value){
$lettersArray = explode('', $value);
if($lettersArray[0] == 'L' || $lettersArray[0] == "l"){
$arr_result[] = $value;
// echo $value . "<br />"; # to echo names as you go
}
}
print_r ($result) // if you want to print all the values as an array at the end
Попробуй это. Но я думаю, что должен быть более простой способ: D
В коде неправильно то, что вы выводите каждое значение на каждой итерации цикла и добавляете его в массив только в том случае, если оно правильное.