Я новичок в PHP, поэтому в основном у меня есть массив без указанного ключа и только значения, которые являются массивами. Я хочу узнать имена людей, которые собираются на весенние каникулы (== правда). Я пробовал это, но не работает ...
$liste = [
['name' => 'Elsa', 'job' => 'Student', 'springbreak' => 'true' ],
['name' => 'Chris', 'job' => 'Teacher', 'springbreak' => 'true' ],
['name' => 'Zob', 'job' => 'Student', 'springbreak' => 'false' ],
['name' => 'Ken', 'job' => 'Teacher', 'springbreak' => 'true' ],
['name' => 'Ryan', 'job' => 'Student', 'springbreak' => 'false' ],
['name' => 'Tenta', 'job' => 'Teacher', 'springbreak' => 'true' ]
];
foreach($liste as $line){
foreach($line as $value){
if ($value['springbreak'] == true)
echo $value['name'];
}
}
вывод должен быть: Эльза, Крис, Кен, Тента






Вы можете использовать array_filter, array_map и join:
<?php
$liste = [
['name' => 'Elsa', 'job' => 'Student', 'springbreak' => 'true'],
['name' => 'Chris', 'job' => 'Teacher', 'springbreak' => 'true'],
['name' => 'Zob', 'job' => 'Student', 'springbreak' => 'false'],
['name' => 'Ken', 'job' => 'Teacher', 'springbreak' => 'true'],
['name' => 'Ryan', 'job' => 'Student', 'springbreak' => 'false'],
['name' => 'Tenta', 'job' => 'Teacher', 'springbreak' => 'true']
];
// Filter to only keep values with springbreak to true
$springbreak_only = array_filter($liste, function($entry) { return $entry['springbreak'] === 'true'; });
// Grab the names (and ditch the rest)
$springbreak_names = array_map(function($entry) { return $entry['name']; }, $springbreak_only);
// Output the comma-separated names
echo join(', ', $springbreak_names);
Альтернатива с array_reduce (будет только один цикл):
$springbreak_names = array_reduce($liste, function($springbreak_names, $entry) {
if ($entry['springbreak'] === 'true')
$springbreak_names[] = $entry['name'];
return $springbreak_names;
}, []);
echo join(', ', $springbreak_names);
См. Ответ @ don't angry me для другого простого решения, менее функционального, но и более простого.
Примечание: вам, вероятно, следует использовать логическое значение true вместо 'true' (строка), когда вы можете.
Почему ваш существующий код не работает?
Потому что вы использовали ненужный дваforeach(), тогда как Одинforeach()
сделает свое дело. Другая причина в том, что вы сравниваете вот так $line['springbreak'] == true, который должен быть $line['springbreak'] == 'true'.
Итак, с вашим существующим кодом. Давай попробуем,
foreach($liste as $line){
if ($line['springbreak'] == 'true')
echo $line['name'];
}
Почему не простоforeach()петля иimplode()чтобы присоединиться к имени, где весенние каникулы - это true?
<?php
$liste = [
['name' => 'Elsa', 'job' => 'Student', 'springbreak' => 'true' ],
['name' => 'Chris', 'job' => 'Teacher', 'springbreak' => 'true' ],
['name' => 'Zob', 'job' => 'Student', 'springbreak' => 'false' ],
['name' => 'Ken', 'job' => 'Teacher', 'springbreak' => 'true' ],
['name' => 'Ryan', 'job' => 'Student', 'springbreak' => 'false' ],
['name' => 'Tenta', 'job' => 'Teacher', 'springbreak' => 'true' ]
];
$names = [];
foreach($liste as $list){
if ($list['springbreak']=='true'){
$names[] = $list['name'];
}
}
echo implode(',',$names);
?>
Выход:
Elsa,Chris,Ken,Tenta
Вы забыли, если заявление.
foreach($liste as $line){
foreach($line as $value){
if ($value['springbreak'] === 'true'){
echo $value['name'];
}
}
}
Я пришел к следующему решению:
<?php
$liste = [
['name' => 'Elsa', 'job' => 'Student', 'springbreak' => 'true' ],
['name' => 'Chris', 'job' => 'Teacher', 'springbreak' => 'true' ],
['name' => 'Zob', 'job' => 'Student', 'springbreak' => 'false' ],
['name' => 'Ken', 'job' => 'Teacher', 'springbreak' => 'true' ],
['name' => 'Ryan', 'job' => 'Student', 'springbreak' => 'false' ],
['name' => 'Tenta', 'job' => 'Teacher', 'springbreak' => 'true' ]
];
$going_to_springbreak = array();
//Check every item
foreach($liste as $line){
//Check first if the 'springbreak' is true
if ($line['springbreak'] == 'true'){
//Then add the name of that item to the new array
$going_to_springbreak[] = $line['name'];
//OR you can add the entire item to the new array if you want to use the other values
//$going_to_springbreak[] = $line;
}
}
var_dump($going_to_springbreak)
?>
Выход:
array(4) {
[0]=>
string(4) "Elsa"
[1]=>
string(5) "Chris"
[2]=>
string(3) "Ken"
[3]=>
string(5) "Tenta"
}
В заключение я настоятельно рекомендую сохранить значение «истина» или «ложь» как примитивное значение, поэтому:
'springbreak' => true
Способ array_reduce () мне кажется перспективным :)