Как эхо значения ассоциативного массива, возвращаемого функцией

Я пытаюсь выполнить что-то, используя ассоциативный массив, как предлагается где-то еще здесь, в Stackoverflow, но я никогда не использовал массивы, поэтому я боюсь. Я искал его, но только чтобы меня больше смутили, чем я!

Вот сделка: я хочу отобразить случайное изображение в качестве фона сайта Worpdress, а также показать имя фотографа, который тоже взял изображение. Поэтому я создал функцию, которая включает ассоциативный массив, который связывает изображение с фотографом, и небольшой скрипт для извлечения как фотографии, так и имени фотографа. Это моя функция:

function bg_image_info() { $creditsList = array( "1" => "Photographer 1", "2" => "Photographer 2", "3" => "Photographer 3", ... ... "74" => "Photographer 74" ); $root = get_stylesheet_directory_uri(); $dir = $root . "/images/bgs/"; $random = mt_rand(1,74); $path = $root . "/images/bgs/bg_" . $random . ".jpg"; $credits = $creditsList["" . $random . ""]; return array($path, $credits); } 

Он работает очень хорошо, но есть один улов. Мне нужно использовать два значения $ path и $ credits в двух разных местах ($ path как атрибут src, $ credits в теге «p»), поэтому то, что я пытался сделать после некоторых исследований, написал эти два функции:

 function bg_image_path() { list($bgPath, $bgCredits) = bg_image_info($path, $credits); echo $bgPath; } function bg_image_credits() { list($bgPath, $bgCredits) = bg_image_info($path, $credits); if($bgCredits) { echo "Photo " . $bgCredits . ""; } } 

а затем вызовите каждый из них, где мне нужно оценить значение. Но похоже, что две функции используют другое случайное значение $, потому что фотография и кредиты не совпадают (они делают, если я заменяю mt_rand () фиксированным значением для целей тестирования).

Итак, как мне повторить два значения, возвращаемые первой функцией, чтобы использовать одно и то же $ случайное значение?

Я действительно очень признателен за любую помощь, спасибо!

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

Я не вижу необходимости в этих двух последних функциях ( bg_image_path() и bg_image_credits() ). Простым решением является вызов вашей основной функции в какой-то момент вашей страницы (перед первым использованием) и просто сохраните эти переменные в случае необходимости.

 list($bgPath, $bgCredits) = bg_image_info($path, $credits); # [...] <img src="<?= $bgPath ?>" /> # [...] <p>Credits: <?= $bgCredits ?></p> 

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

В любом случае, если вы хотите повторить свои ценности с помощью различных функций, вам нужно разделить случайное число между ними, чтобы вы получили одно и то же. Первый способ, который приходит мне на ум – вы сами генерируете номер, и они используют две функции, чтобы отразить правильную вещь, передав им этот номер. Но так как вы хотите сохранить все это в функциональных вызовах, я думаю, вы предпочтете сделать это аналогично вашей текущей настройке из 3 функций. Что можно сделать, это полная переработка, чтобы просто генерировать значение в основной функции и хранить данные в других:

 function bg_image_info() { # note the global to avoid it being local only global $bg_random = mt_rand(1,74); } function bg_image_path() { echo get_stylesheet_directory_uri() . "/images/bgs/bg_$bg_random.jpg"; } function bg_image_credits() { $creditsList = [ 'none', "Photographer 1", "Photographer 2", "Photographer 3", # ... "Photographer 74" ]; echo $creditsList[$bg_random]; } <?php bg_image_info(); ?> <img src="<? bg_image_path() ?>" /> <p>Credits: <? bg_image_credits() ?></p> 

Или идете с объектно-ориентированным подходом!

 class RandomImage { public $path; public $credits; public function __construct() { $r = mt_rand(1,74); $creditsList = [ 'none', "Photographer 1", "Photographer 2", "Photographer 3", # ... "Photographer 74" ]; $path = get_stylesheet_directory_uri() . "/images/bgs/bg_$r.jpg"; $credits = $creditsList[$r]; } } <?php $img = new RandomImage; ?> <img src="<?= $img->path ?>" /> <p>Credits: <?= $img->credits ?></p> 

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

 <?php $colors = array("0"=>"Red","1"=>"Green","2"=>"Blue"); echo "0th element of array is " . $colors["0"]; echo "<br>"; //looping foreach ($colors as $key=>$value){ echo "Key=".$key." value=".$value; echo "<br>"; } ?> 

Вывод:

 0th element of array is Red Key=0 value=Red Key=1 value=Green Key=2 value=Blue