【问题标题】:How to echo values of an associative array returned by function如何回显函数返回的关联数组的值
【发布时间】:2017-01-24 17:32:38
【问题描述】:

我正在尝试使用 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 . "";
    }
}

然后在我需要重视的地方打电话给每个人。但看起来这两个函数使用了不同的 $random 值,因为照片和学分不匹配(如果我将 mt_rand() 替换为用于测试目的的固定值,它们就会匹配)。

那么如何回显第一个函数返回的两个值,以便使用相同的 $random 值?

非常感谢任何帮助,谢谢!

【问题讨论】:

    标签: php arrays random associative


    【解决方案1】:

    当然会发生这种情况,因为您调用该函数两次,每次 时间你想要路径或学分,从而产生两个不同的 随机值。

    我认为不需要最后两个函数(bg_image_path()bg_image_credits())。一个简单的解决方法是调用你的 main 函数 页面中的某个点(首次使用之前)并保留这些变量 需要时使用。

    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>
    

    【讨论】:

    • 嗨@sidyll,谢谢你的回答,我喜欢它看起来多么简单!我有点困惑我应该把“list($bgPath, $bgCredits) = bg_image_info($path, $credits);”移到哪里bit — 它应该在 return 语句之后进入我的 main 函数吗?或者我应该创建一个新功能? (实际上我现在都试过了,但都不起作用,不知道我做错了什么......)
    • 嗨@Bankitalia 不需要其他功能,只需直接在您的目标页面中使用它(例如在您的第一个&lt;?php ?&gt; 中)。你的页面是如何工作的?如果您仍有任何疑问,请告诉我,我会写一个完整的示例。
    • 嗨@sidyll,是的,我在一分钟前意识到了这一点,并让它在我的网站上运行。谢谢! :) 但是我很想听听您是否有任何关于将 list() 位合并到主函数中的想法,或者可能创建一个额外的函数,这样我就不必直接在页面中添加额外的代码......我在几个不同的页面中使用它,这样有助于保持整洁;)
    • @Bankitalia 我用其他示例进行了编辑。当然,它们只是建议,可以用多种不同的方式编写。最后一个特别,我不是在呼应,但可以像功能一样做。无论如何,我只是想包括差异(特别是在语法方面!)给你另一个视角,并希望有一些新技巧:D
    • 嘿@sidyll,非常感谢您花时间编写这些示例!第二个对我来说有点太高级了,但第一个看起来不错。如果你有更多的时间来解决这个问题,我还有另一个挑战——我有一个带有轮播的页面,其中每张幻灯片都应该有自己的随机背景。我刚刚意识到使用我们已有的解决方案,每张幻灯片都会出现相同的图像......我们如何更改不同幻灯片的 $random 值?无论如何,再次感谢您迄今为止的帮助!
    【解决方案2】:

    关联数组使用命名键作为值,我们可以像索引数组一样以类似的方式创建它们。 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-03-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多