Использование массива в качестве параметра функции php

0

У меня есть массив, который я хотел бы передать функции как параметр. Эти значения массива будут использоваться для вытягивания значений из другого массива и их отображения.

Моя функция:

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. Я уверен, что это глупый надзор. Заранее спасибо!

  • 0
    Почему вы используете ссылку в =>&$features ? Вам нужно использовать ссылку, только если вы собираетесь изменить переменную и хотите, чтобы она влияла на исходный массив. Если вы просто читаете переменную, нет смысла делать ее ссылочной переменной.
Теги:
arrays

3 ответа

0
Лучший ответ

Вы не передаете массив функции, вы передаете две строки. Вы должны вызвать 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 в цикле, вы вернете только первый найденный бренд.

  • 0
    Будет ли цикл по $ listbrands иметь преимущество с точки зрения производительности или другого, поскольку мой массив $ treadmills в конечном итоге будет намного больше?
  • 0
    Да лучше. Я обновил ответ объяснением.
0
function showTreadmills($listbrands) {
    global $treadmills;

    $out = '';
    foreach( $treadmills as $brand=>&$features ) {
        if ($brand == $listbrands) { 
            $out .= '<p>'.$features["description"].'</p>';
        }
    }

    return $out;
}
0

Проблема в том, что вы возвращаетесь в свой первый матч:

if ($brand == $listbrands) { 
        return '<p>'.$features["description"].'</p>';
}

Вам нужно будет сохранить все ваши совпадения, чтобы весь цикл мог закончить, а затем отправить все, что соответствовало.

$matches = '';
foreach( $treadmills as $brand=>&$features ) {
    if ($brand == $listbrands) { 
        $matches .= '<p>'.$features["description"].'</p>';
    }
}
return $matches;
  • 0
    Не уверен, почему я получил отрицательный голос, мой ответ на месте!
  • 0
    да, вы правы! .. убедитесь, что вы редактируете правильно .. так, чтобы вы сделали это более понятным :)
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню