У меня есть массив, который я хотел бы передать функции как параметр. Эти значения массива будут использоваться для вытягивания значений из другого массива и их отображения.
Моя функция:
function showTreadmills($listbrands) {
global $treadmills;
foreach( $treadmills as $brand=>&$features ) {
if ($brand == $listbrands) {
return '<p>'.$features["description"].'</p>';
}
}
}
Магистральный трек:
$treadmills = [
'bowflexseries3' => [
'description' => 'Bowflex Series 3',
'image' => '/images/bowflex-series-3-150x150.jpg',
'url' => '/treadmills/bowflex/series-3',
],
'solef85' => [
'description' => 'Sole F85',
'image' => '/images/sole-f85-150x150.jpg',
'url' => '/treadmills/sole/f-85',
],
'endurancet10hrc' => [
'description' => 'Endurance T10HRC',
'image' => '/images/endurance-t10hrc-150x150.jpg',
'url' => '/treadmills/endurance/t10hrc',
]
];
Значения, которые я пытаюсь вывести из массива в своей функции:
<?php echo showTreadmills('bowflexseries3','solef85'); ?>
Это возвращает только первое описание из массива, которое является Bowflex Series 3. Я пытаюсь выяснить, как заставить его вытащить описание для bowflexseries3 и solef85. Я уверен, что это глупый надзор. Заранее спасибо!
Вы не передаете массив функции, вы передаете две строки. Вы должны вызвать array()
чтобы обернуть вокруг них массив:
echo showTreadmills(array('bowflexseries3','solef85'));
Затем вам нужно изменить showTreadmills
. Вы не можете использовать ==
для сравнения строки с массивом. Похоже, вы хотите проверить, находится ли строка в массиве, поэтому она должна быть:
if (in_array($brand, $listbrands))
Или вместо того, чтобы цикл через $treadmills
и тестирование равны ли одному из $listbands
, вы могли бы перебрать $listbrands
:
$result = '';
foreach ($listbrands as $brand) {
if (isset($treadmills[$brand])) {
$result .= '<p>'.$treadmills[$brand]["description"].'</p>';
}
}
return $result;
Это лучше, поскольку он проходит через меньший массив. И in_array()
должен выполнять поиск, а доступ к ассоциативному массиву - это просто поиск хэша.
Обратите внимание, что вам нужно объединить результаты в строку во время цикла. Если вы используете return
в цикле, вы вернете только первый найденный бренд.
function showTreadmills($listbrands) {
global $treadmills;
$out = '';
foreach( $treadmills as $brand=>&$features ) {
if ($brand == $listbrands) {
$out .= '<p>'.$features["description"].'</p>';
}
}
return $out;
}
Проблема в том, что вы возвращаетесь в свой первый матч:
if ($brand == $listbrands) {
return '<p>'.$features["description"].'</p>';
}
Вам нужно будет сохранить все ваши совпадения, чтобы весь цикл мог закончить, а затем отправить все, что соответствовало.
$matches = '';
foreach( $treadmills as $brand=>&$features ) {
if ($brand == $listbrands) {
$matches .= '<p>'.$features["description"].'</p>';
}
}
return $matches;
=>&$features
? Вам нужно использовать ссылку, только если вы собираетесь изменить переменную и хотите, чтобы она влияла на исходный массив. Если вы просто читаете переменную, нет смысла делать ее ссылочной переменной.