访问数组php中的特定数组
首先,我是个初学者:) 我在一家美术馆的网站上工作(46位艺术家,每3位作品列表+大量其他数据) 所以我决定创建一个主阵列,所有艺术家及其作品都列在阵列时尚中的阵列中。我开始思考如何使用foreach循环访问阵列的各个部分。然而,我很难弄清楚如何单独访问每个艺术家访问数组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
$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项已消失,因为您可以