Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/kubernetes/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
访问数组php中的特定数组_Php_Arrays_Loops_Multidimensional Array_Foreach - Fatal编程技术网

访问数组php中的特定数组

访问数组php中的特定数组,php,arrays,loops,multidimensional-array,foreach,Php,Arrays,Loops,Multidimensional Array,Foreach,首先,我是个初学者:) 我在一家美术馆的网站上工作(46位艺术家,每3位作品列表+大量其他数据) 所以我决定创建一个主阵列,所有艺术家及其作品都列在阵列时尚中的阵列中。我开始思考如何使用foreach循环访问阵列的各个部分。然而,我很难弄清楚如何单独访问每个艺术家 $artists = array( $sitnikov = array( $sitnikov[] = array( "artist" => "Vasily S

首先,我是个初学者:)

我在一家美术馆的网站上工作(46位艺术家,每3位作品列表+大量其他数据)

所以我决定创建一个主阵列,所有艺术家及其作品都列在阵列时尚中的阵列中。我开始思考如何使用foreach循环访问阵列的各个部分。然而,我很难弄清楚如何单独访问每个艺术家

       $artists = array(
            $sitnikov = array(
        $sitnikov[] = array(
        "artist" => "Vasily Sitnikov",
        "title" => '"'."Long Journey".'"',
        "year" => 1982,
        "media" => "Oil and tempera on plywood",
        "dimentions" => "H:" . 10 . " x W:" . 30.5 . "in",
        "availability" => "Sold",
        "thumb" => BASE_URL . "artists/vasily_sitnikov/images/ldpi/Thumb_Sitnikov_Vasily_Freedom.jpg",
        "lg" => BASE_URL . "artists/vasily_sitnikov/images/mdpi/Lg_Sitnikov_Vasily_Freedom.jpg"
        ),
        ),
        $slepishev = array(
        $slepishev[] = array(
        "artist" => "Anatoly Slepishev",
        "title" => '"'."Rider".'"',
        "year" => 1990,
        "media" => "Mixed media on paper",
        "dimentions" => "H:" . 19.5 . " x W:" . 25.5 . "in",
        "availability" => $available,
        "thumb" => BASE_URL .     "artists/anatoly_slepyshev/images/ldpi/Thumb_Anatoly_Slepishev_Rider.jpg",
        "lg" => BASE_URL . "artists/anatoly_slepyshev/images/mdpi/Lg_Anatoly_Slepishev_Rider.jpg",
        "literature" => "2011 Man’s Best Friends in the Works of Russian Artists Sloane Gallery of Art. ArtNet Online catalogue"
        ),
    $slepishev[] = array(
        "artist" => "Anatoly Slepishev",
        "title" => '"'."Lakeside".'"',
        "year" => 1991,
        "media" => "Watercolor on paper",
        "dimentions" => "H:" . 19.5 . " x W:" . 25.5 . "in",
        "availability" => $available,
        "thumb" => BASE_URL . "artists/anatoly_slepyshev/images/ldpi/Thumb_Anatoly_Slepyshev_Lakeside.jpg",
        "lg" => BASE_URL . "artists/anatoly_slepyshev/images/mdpi/Lg_Anatoly_Slepyshev_Lakeside.jpg",
        "literature" => "2011 Man’s Best Friends in the Works of Russian Artists Sloane Gallery of Art. ArtNet Online catalogue"
        ),
    $slepishev[] = array(
        "artist" => "Anatoly Slepishev",
        "title" => '"'."Rest".'"',
        "year" => 1991,
        "media" => "Watercolor on paper",
        "dimentions" => "H:" . 19.5 . " x W:" . 25.5 . "in",
        "availability" => $available,
        "thumb" => BASE_URL . "artists/anatoly_slepyshev/images/ldpi/Thumb_Anatoly_Slepyshev_Rest.jpg",
        "lg" => BASE_URL . "artists/anatoly_slepyshev/images/mdpi/Lg_Anatoly_Slepyshev_Rest.jpg"
        ))
);

echo "<pre>";
foreach ($artists as $artists_id => $artist_each) {
            echo $artist_id . "</br>";

        foreach ($artist_each as $artist_id => $artists_work) {
            echo 
            $artists_work["artist"] ."<br>"
            . $artists_work["title"] . "<br>"
            . $artists_work["year"] . "<br>" 
            . $artists_work["media"]. "<br>"
            . $artists_work["dimentions"] ."<br>"
            . $artists_work["availability"] ."<br>"
            .'"<img src ="' . $artists_work["thumb"] .'" /><br>'.
            '"<img src ="' . $artists_work["lg"] .'" /><br>'
            ;

        }
      }


      echo "</pre>";
下面是数组的一部分和访问它的foreach循环

我想要实现的是能够使用一个非常大的阵列,并且能够单独访问每个艺术家的阵列

       $artists = array(
            $sitnikov = array(
        $sitnikov[] = array(
        "artist" => "Vasily Sitnikov",
        "title" => '"'."Long Journey".'"',
        "year" => 1982,
        "media" => "Oil and tempera on plywood",
        "dimentions" => "H:" . 10 . " x W:" . 30.5 . "in",
        "availability" => "Sold",
        "thumb" => BASE_URL . "artists/vasily_sitnikov/images/ldpi/Thumb_Sitnikov_Vasily_Freedom.jpg",
        "lg" => BASE_URL . "artists/vasily_sitnikov/images/mdpi/Lg_Sitnikov_Vasily_Freedom.jpg"
        ),
        ),
        $slepishev = array(
        $slepishev[] = array(
        "artist" => "Anatoly Slepishev",
        "title" => '"'."Rider".'"',
        "year" => 1990,
        "media" => "Mixed media on paper",
        "dimentions" => "H:" . 19.5 . " x W:" . 25.5 . "in",
        "availability" => $available,
        "thumb" => BASE_URL .     "artists/anatoly_slepyshev/images/ldpi/Thumb_Anatoly_Slepishev_Rider.jpg",
        "lg" => BASE_URL . "artists/anatoly_slepyshev/images/mdpi/Lg_Anatoly_Slepishev_Rider.jpg",
        "literature" => "2011 Man’s Best Friends in the Works of Russian Artists Sloane Gallery of Art. ArtNet Online catalogue"
        ),
    $slepishev[] = array(
        "artist" => "Anatoly Slepishev",
        "title" => '"'."Lakeside".'"',
        "year" => 1991,
        "media" => "Watercolor on paper",
        "dimentions" => "H:" . 19.5 . " x W:" . 25.5 . "in",
        "availability" => $available,
        "thumb" => BASE_URL . "artists/anatoly_slepyshev/images/ldpi/Thumb_Anatoly_Slepyshev_Lakeside.jpg",
        "lg" => BASE_URL . "artists/anatoly_slepyshev/images/mdpi/Lg_Anatoly_Slepyshev_Lakeside.jpg",
        "literature" => "2011 Man’s Best Friends in the Works of Russian Artists Sloane Gallery of Art. ArtNet Online catalogue"
        ),
    $slepishev[] = array(
        "artist" => "Anatoly Slepishev",
        "title" => '"'."Rest".'"',
        "year" => 1991,
        "media" => "Watercolor on paper",
        "dimentions" => "H:" . 19.5 . " x W:" . 25.5 . "in",
        "availability" => $available,
        "thumb" => BASE_URL . "artists/anatoly_slepyshev/images/ldpi/Thumb_Anatoly_Slepyshev_Rest.jpg",
        "lg" => BASE_URL . "artists/anatoly_slepyshev/images/mdpi/Lg_Anatoly_Slepyshev_Rest.jpg"
        ))
);

echo "<pre>";
foreach ($artists as $artists_id => $artist_each) {
            echo $artist_id . "</br>";

        foreach ($artist_each as $artist_id => $artists_work) {
            echo 
            $artists_work["artist"] ."<br>"
            . $artists_work["title"] . "<br>"
            . $artists_work["year"] . "<br>" 
            . $artists_work["media"]. "<br>"
            . $artists_work["dimentions"] ."<br>"
            . $artists_work["availability"] ."<br>"
            .'"<img src ="' . $artists_work["thumb"] .'" /><br>'.
            '"<img src ="' . $artists_work["lg"] .'" /><br>'
            ;

        }
      }


      echo "</pre>";
$artists=array(
$sitnikov=数组(
$sitnikov[]=数组(
“艺术家”=>“Vasily Sitnikov”,
“标题”=>““长途旅行”,
“年”=>1982年,
“介质”=>“胶合板上的油和回火”,
“尺寸”=>“H:.10.”x W:.30.5.“英寸”,
“可用性”=>“已售出”,
“thumb”=>BASE_URL.“artists/vasily_sitnikov/images/ldpi/thumb_sitnikov_vasily_Freedom.jpg”,
“lg”=>BASE_URL.“artists/vasily_sitnikov/images/mdpi/lg_sitnikov_vasily_Freedom.jpg”
),
),
$slepishev=数组(
$slepishev[]=数组(
“艺术家”=>“安纳托利·斯莱皮舍夫”,
“标题”=>“,“骑手”,
“年份”=>1990年,
“介质”=>“纸上混合介质”,
“尺寸”=>“H:.19.5.”x W:.25.5.“英寸”,
“可用性”=>可用美元,
“thumb”=>BASE\u URL.“artists/anatoly\u slepyshev/images/ldpi/thumb\u anatoly\u Slepishev\u Rider.jpg”,
“lg”=>BASE_URL.“artists/anatoly_slepyshev/images/mdpi/lg_anatoly_Slepishev_Rider.jpg”,
“文学”=>“2011年俄罗斯艺术家作品中人类最好的朋友斯隆艺术画廊。ArtNet在线目录”
),
$slepishev[]=数组(
“艺术家”=>“安纳托利·斯莱皮舍夫”,
“标题”=>“,“湖边”,
“年份”=>1991年,
“媒体”=>“纸上水彩”,
“尺寸”=>“H:.19.5.”x W:.25.5.“英寸”,
“可用性”=>可用美元,
“thumb”=>BASE_URL.“artists/anatoly_slepyshev/images/ldpi/thumb_anatoly_slepyshev_Lakeside.jpg”,
“lg”=>BASE_URL.“artists/anatoly_slepyshev/images/mdpi/lg_anatoly_slepyshev_Lakeside.jpg”,
“文学”=>“2011年俄罗斯艺术家作品中人类最好的朋友斯隆艺术画廊。ArtNet在线目录”
),
$slepishev[]=数组(
“艺术家”=>“安纳托利·斯莱皮舍夫”,
“标题”=>“,“其余”,
“年份”=>1991年,
“媒体”=>“纸上水彩”,
“尺寸”=>“H:.19.5.”x W:.25.5.“英寸”,
“可用性”=>可用美元,
“thumb”=>BASE\u URL.“artists/anatoly\u slepyshev/images/ldpi/thumb\u anatoly\u slepyshev\u Rest.jpg”,
“lg”=>BASE_URL.“artists/anatoly_slepyshev/images/mdpi/lg_anatoly_slepyshev_Rest.jpg”
))
);
回声“;
foreach($artists as$artists\u id=>$artists\u每个){
echo$artist_id.“
”; foreach($artist\u每个作为$artist\u id=>$artists\u work){ 回响 $artists\u作品[“artist”]。“
” .$artists_作品[“title”]。“
” .$Artisters_作品[“年]。”
“ .$Artisters_作品[“媒体”]。“
” .$Artisters_作品[“尺寸”]。“
” .$Artisters_作品[“可用性”]。“
” “
”。 “
” ; } } 回声“;
数组的语法不完善。您应该始终使用
=>
操作符在数组中创建键/值对。键应该是整数、字符串(例如
“sitnikov”
)或具有整数或字符串值的现有变量(例如
$sitnikov
)。您不应以
[]
结束密钥:

$artists = array(
    $sitnikov = array(
        $sitnikov[] = array(

如果将第一个
foreach
循环后的行立即更改为
echo$artists\u id,则嵌套的
foreach
循环将正常工作。“

如果数组有点损坏,请更改结构

$artists = array (
    'sitnikov' => array(
        "artist" => "Vasily Sitnikov",
        "title" => '"'."Long Journey".'"'
    ),
    'slepishev' => array(
        "artist" => "Anatoly Slepishev",
        "title" => '"'."Lakeside".'"'
    )
);
你不需要第二个“西特尼科夫”的[]。这是您正在寻找的结构:

foreach ( $artists as $artist => $values) {
    echo "Artist: " . $values['artist'] . "<br>";
    echo "Title: " . $values['title'] . "<br>";
    echo "<hr>";
}
然后,您可以执行以下操作:

[artist]: Vasily Sitnikov

[picture]: Long Journey
year: 1982
media: Oil and tempera on plywood
dimentions: 10 30.5
availability: Sold

[artist]: Anatoly Slepishev

[picture]: Rider
year: 1990
media: Mixed media on paper
dimentions: 19.5 25.5
availability: Available
literature: 2011 Man’s Best Friends [...]

[picture]: Lakeside
year: 1991
media: Watercolor on paper
dimentions: 19.5 25.5
availability: Available
literature: 2011 Man’s Best Friends [...]
foreach($artists作为$artist=>$value){
回声“艺术家:.”值['Artister']。“
”; 回显“标题:.”值['Title']。“
”; 回声“
”; }
这只是一个例子,所以请让它适合您的需要。

天啊,天啊

别误会我的意思:我对你在PHP语言方面所取得的成就印象深刻。 然而,还有其他方法可以让你省去很多努力

我可能错了,但你的代码让我觉得,如果你继续努力,你可以成为一名相当好的程序员。这就是为什么我决定尝试让你开始做一些事情


当前方法的问题是直接在代码中定义所有数据。每次需要修改一点信息时,它都会迫使您处理不太友好的PHP语法

正如其他答案清楚地表明的那样,您最终会得到一个非常不可读且很难(如果不是不可能)维护的代码。
大约有40名艺术家,这个阵列将是巨大的,发现或修改给定的信息将成为一场噩梦

主要的一点是从代码中去除数据的相关性

在我看来,关键在于找到一种解决方案,它不需要大量的PHP专业知识,但仍然允许您相对轻松地维护数据。
超级专业人士会使用数据库,但这需要大量投资才能学会如何在PHP中处理这些笨重的野兽。
我想我们可以满足于一个简单的文本文件。例如:

<?php

// -------------------
// Database parameters
// -------------------

// database default name
define ('DATABASE_NAME', "database.txt");

// database save directory
define ('SAVE_DIR', "save/");

// site root
define ('BASE_URL', "http://...."); // <-- *** PUT THE PROPER URL HERE


// ------------------------------
// main database reading function
// ------------------------------
function read_database ($filename = DATABASE_NAME)
{
    // list of properties that must be defined for each picture
    $mandatory_data = array (
        'year', 'dimentions', 'media', 'availability');
    // list of valid properties
    $allowed_data = array_merge ($mandatory_data, array (
        'literature'));

    // read the whole file into a string
    $file = file_get_contents ($filename);

    // split the file into lines
    $lines = explode ("\n", $file);

    // analyze each line
    $a = null; // current artist
    $p = null; // current picture
    $l = 0;    // current line number
    foreach ($lines as $line)
    {
        // keep track of line number for error reporting
        $l++;

        // eliminate trailing spaces and skip empty lines
        $line = trim ($line);
        if ($line == '') continue;

        // get the line type and value
        list ($type, $value) = explode (':', $line, 2);
        if ($value == null) panic ($line, "missing ':' delimiter");

        // decode the type
        $type = trim($type); // eliminate white spaces
        $value = trim($value);
        switch ($type)
        {
        case '[artist]':
            // create a new artist
            if (isset ($database[$value])) panic ($l, "artist '$value' defined more than once");
            $a = $value;
            $db[$a] = array();
            break;
        case '[picture]':
            // create a new picture for the current artist
            if ($a === null)         panic ($l, "picture defined before an artist was specified");
            if (isset ($db[$value])) panic ($l, "artist '$value' defined more than once");
            $p = $value;
            $db[$a][$p] = array();
            break;
        default:
            // all other values are simply stored as data
            // associated to the current picture of the current artist
            if ($a === null) panic ($l, "data defined before an artist was specified");
            if ($p === null) panic ($l, "data defined before a picture was specified");
            if (isset($db[$a][$p][$value])) panic ($l, "data '$type' defined more than once");
            $db[$a][$p][$type] = $value;
            break;
        }
    }

    // compute final data
    foreach ($db as $a => $pictures)
    {
        foreach ($pictures as $p => $picture)
        {
            // check mandatory data
            foreach ($mandatory_data as $data)
            {
                if (!isset ($picture[$data]))
                {
                    warning ($a,$p, "data '$data' not defined");
                    // set a dummy value to avoid errors in further processing
                    $picture[$data]="";
                }
            }

            // check allowed data
            foreach ($picture as $data => $value)
            {
                if (!in_array ($data, $allowed_data))
                {
                    warning ($a,$p, "invalid data name '$data'");
                }
            }

            // add picture name
            $picture['name'] = '"'.$p.'"';

            // compute pretty "dimentions" value
            @list ($w, $h, $extra) = explode (" ", $picture['dimentions']);
            if ($w == null || $h == null || $extra != null) warning ($a, $p, "invalid dimentions format");
            $picture['pretty_dimensions'] = "W: $w H: $h in.";

            // compute thumb and lg
            $uartist  = underscore_string ($a);
            $upicture = underscore_string ($p);
            $picture['thumb'] = BASE_URL . "artists/${uartist}/images/ldpi/Thumb_${uartist}_${upicture}.jpg";
            $picture['lg']    = BASE_URL . "artists/${uartist}/images/mdpi/Lg_${uartist}_${upicture}.jpg";

            // update current picture
            $db[$a][$p] = $picture;
        }
    }

    // done
    return $db;
}

function write_database ($db, $filename=DATABASE_NAME)
{
    // list of auto-computed properties
    $auto_data = array (
        'name', 'thumb', 'lg', 'pretty_dimensions');

    // make a safety copy of the current database state
    copy_to_safety ($filename);

    // compute new file contents
    $output = '';
    foreach ($db as $a => $pictures)
    {
        $output .= "[artist]:$a\n\n";
        foreach ($pictures as $p => $picture)
        {
            $output .= "[picture]:$p\n\n";
            foreach ($picture as $data => $value)
            {
                // skip auto-computed fields
                if (in_array ($data, $auto_data)) continue;

                $output .= "$data: $value\n";
            }
        }
    }

    // overwrite DB file with new contents
    file_put_contents ($filename, $output);
}

// copy a file to safety
function copy_to_safety ($filename)
{
    // nothing to do if there is no previous version
    if (!file_exists ($filename)) return;

    // create save directory if need be
    if (!file_exists(SAVE_DIR)) mkdir (SAVE_DIR, 0777, true);

    // copy the file
    $save_name = SAVE_DIR.$filename.date(" Y-M-d@H.i.s");
    file_put_contents ($save_name, file_get_contents ($filename));
}

// name computations
function underscore_string ($s)
{
    return str_replace (" ", "_", $s);
}

// error reporting
function panic ($line, $message)
{
    die ("FATAL ERROR in line <b>$line</b>: $message<br />");
}

function warning ($artist, $picture, $message)
{
    echo ("artist '$artist' picture '$picture': $message<br />");
}

// ----
// test
// ----

// display all sold pictures
function display_sold_pictures ($db)
{
    echo "<h1>sold pictures</h1>";
    echo "<table><tr><th>Artist</th><th>Picture</th><th>Year</th></tr>";
    foreach ($db as $a => $pictures)
        foreach ($pictures as $p => $picture)
        {
            if ($db[$a][$p]['availability'] != 'Sold') continue;
            echo "<tr><td>$a</td><td>$p</td><td>${picture['year']}</td></tr>";
        }
    echo "</table>";
}

// display sold pictures in the current DB
$db = read_database ();
display_sold_pictures ($db);

// mark every picture as sold
foreach ($db as $a => $pictures)
    foreach ($pictures as $p => $picture)
        $db[$a][$p]['availability'] = 'Sold';

// save the database
write_database ($db, "dummy.txt");

// display sold pictures in the modified DB
$db = read_database ("dummy.txt");
display_sold_pictures ($db);

?>
请注意,此“自制数据库”的几个字段与数组内容不同:

  • 拇指和url项已消失,因为您可以