下午好,
我一直试图找出构建一个数组,用于functions.php
内的多个函数。看来我需要在自己的函数中创建数组,然后在其他函数中引用它。但事情让我感到困惑。
我不打算在引用它的其他函数中操纵数据,他们只需要访问变量。
寻找以下内容:
function test($sample_array)
{
return array
( array('1','red'),
array('2','blue'),
array('3','green'),
array('4','yellow') );
} //close $sample_array
function sample_function( array test($sample_array) )
{ // blah blah function code
foreach test($sample_array as $value)
{
echo "color ". $value[2] ."<br>;"
echo "number ". $value[1] ."<br>;"
} //close foreach test
} //close sample_function
function other_example_function( array test($sample_array) )
{ // blah blah function code
foreach test($sample_array as $value)
{
echo "number". $value[1] ."<br>;"
echo "color ". $value[2] ."<br>;"
} //close foreach test
} //close other_example_function
但我找不到任何甚至接近该结构的例子。我错了吗?或者我误解了如何共享array
的访问权限?
谢谢!
答案 0 :(得分:3)
您的代码需要进行大量更改(所有更改都已完成并指定): -
<?php
function test() // since you are returning a newly created array so need of passing any array
{
return array (array('1','red'),array('2','blue'),array('3','green'),array('4','yellow') );
}
function sample_function() // you have to call another function inside the function not in passed parameter
{
$result = test($sample_array); // since function test() returns an array so you have to save that array into a variable and then you have to use it in foreach loop
foreach ( $result as $value) // use variable here not the function itself
{
echo "color ". $value[1] ."<br>"; // ; must be outside
echo "number ". $value[0] ."<br>";// ; must be outside
}
}
function other_example_function() // you have to call a function inside any function not in passed parameter
{
$result = test($sample_array); // since function test() returns an array so you have to save that array into a variable and then you have to use it in foreach loop
foreach ( $result as $value) // use variable here not the function itself
{
echo "number ". $value[0] ."<br>";// ; must be outside
echo "color ". $value[1] ."<br>"; // ; must be outside
}
}
// now call the function
sample_function();
other_example_function();
?>
输出: - https://eval.in/601096
另一个解决方案(我先给出的)是: -
答案 1 :(得分:2)
感谢大家的帮助:)
对于将来访问此线程的任何人,我的目标是将多维数组传递给多个函数,以用于构建Admin Metabox。
因为我发现实用示例比代码snippit更有用,所以我将在下面的functions.php
中包含完整的代码。
我已经验证了创建Admin Metabox的代码,保存元数据,并在清除条目时删除旧的元数据。在我的WP开发安装中正确加载元数据。
//
// RECIPE METABOX
//
// call the add_meta_box function
function add_embed_recipe_meta_box() {
add_meta_box( 'embed_recipe_meta_box', // $id
'Recipe Post meta box', // $title
'show_embed_recipe_meta_box', // $callback
'post', // $page
'normal', // $context
'high' ); }
add_action( "add_meta_boxes", "add_embed_recipe_meta_box" );
// build array for use in metabox
function recipe($recipe_array) {
return array
(
array('1','recipe_embed1','servings'),
array('2','recipe_embed2','prep time'),
array('3','recipe_embed3','cook time'),
array('4','recipe_embed4','ingredients'),
array('5','recipe_embed5','spices'),
array('6','recipe_embed6','special tools')
);
} // close function recipe
// add the admin metabox
function show_embed_recipe_meta_box( $post,$recipe_array )
{
$result = recipe($recipe_array);
foreach ( $result as $value)
{ ${'recipe_meta'.$value[0]} = get_post_meta( $post->ID, $key=$value[1], true ); }
wp_nonce_field( basename( __FILE__ ), "recipe-meta-box-nonce" );
//table content here
echo "<table>";
foreach ( $result as $value)
{
echo "<tr>";
echo "<td> <div class=\"meta-title\"> <label for=\"recipe_embed". $value[0]. "\">". $value[2] .".</label></div></td>";
echo "<td> <input type=\"text\" size=\"60\" name=\"recipe_embed". $value[0]. "\" id=\"recipe_embed". $value[0]. "\" value=\"". ${'recipe_meta'.$value[0]} ."\"></td>";
echo "</tr>";
}
echo "</table>";
} //closing show_embed_recipe_meta_box
// check and save the metabox data
function save_recipe_embed( $post_id, $post, $update, $recipe_array )
{
// checking here
if ( ! isset( $_POST[ "recipe-meta-box-nonce" ] ) || ! wp_verify_nonce( $_POST[ "recipe-meta-box-nonce" ], basename( __FILE__ ) ) )
{ return $post_id; }
if ( ! current_user_can( "edit_post", $post_id ) ) { return $post_id;}
if ( defined( "DOING_AUTOSAVE" ) && DOING_AUTOSAVE ) { return $post_id; }
$slug = "post";
if ( $slug != $post->post_type ) { return $post_id; }
// saving here
$result = recipe($recipe_array);
foreach ( $result as $value)
{
$old = get_post_meta($post_id, $key=$value[1], true);
$new = $_POST[$value[1]];
if ($new && $new != $old) {
update_post_meta($post_id, $key=$value[1], $new);
} elseif ('' == $new && $old) {
delete_post_meta($post_id, $key=$value[1], $old);
}
} // close foreach recipe_array
} // close save_recipe_embed
add_action( "save_post", "save_recipe_embed", 10, 3 );
传递数组让我消除了大约一半的原始代码!
我可以使用foreach
注册元字段,显示Admin Metabox,以及保存元字段。以前每个元字段的创建/显示/保存都必须单独编码。
再次感谢您的帮助。
希望这对其他人也很有用,因为我无法在我能理解的语法中找到类似的传递数组的用法。
答案 2 :(得分:1)
@Anant的精彩回答。但我不能“接受”他们的答案,因为它只是作为评论输入,所以我在这里重新显示它,所以我可以回答我的问题。
<?php
$sample_array = array();
function test($sample_array)
{
return array
( array('1','red'),
array('2','blue'),
array('3','green'),
array('4','yellow') );
}
function sample_function( $sample_array)
{
$result = test($sample_array);
foreach ( $result as $value)
{
echo "color ". $value[0]."<br>";
echo "number ".$value[1]."<br>";
}
}
function other_example_function( $sample_array )
{
$result = test($sample_array);
foreach ( $result as $key=> $value)
{
echo "number ".$value[1]."<br>";
echo "color ". $value[0]."<br>";
}
}
sample_function($sample_array);
other_example_function($sample_array);
答案 3 :(得分:0)
您的代码存在大量问题
function test($sample_array) ...
首先关闭此功能不需要$sample_array
参数。该函数不使用该参数,因此只需将其删除即可。
// "nullary" functions do not have any parameters
function test() {
return array (
array('1','red'),
array('2','blue'),
array('3','green'),
array('4','yellow')
);
}
然后你有这些。这些到底是什么?这是完全无效的PHP,所以我不知道为什么你甚至会问它,说实话。如果你先修复语法错误,你可能会自己找到答案。
// SYNTAX ERROR
function sample_function( array test($sample_array) ) ...
// and
function other_example_function( array test($sample_array) ) ...
这些应该是采用数组的函数
// correct function signature
function sample_function(array $arr) { ...
// and
function other_example_function(array $arr) { ...
如果您不想要array
类型提示,则甚至不需要。我个人喜欢类型提示,但似乎你不太了解PHP所以我会告诉你这同样有效:
// also correct function signature
function sample_function($arr) { ...
// and
function other_example_function($arr) { ...
现在使用嵌套数组...首先,不要忘记数组以0
索引开头。第一个值为$arr[0]
,第二个值为$arr[1]
,第三个值为$arr[2]
,等等。其次,您的echo语句存在语法错误
// SYNTAX ERRROR
echo "color ". $value[2] ."<br>;"
echo "number ". $value[1] ."<br>;"
数组索引是错误的,您是否注意到引号内的分号;
?这应该是
// correct semicolon use
echo "color ". $value[1] ."<br>";
echo "number ". $value[0] ."<br>";
现在让我们看一个完整的函数示例......
function sample_function($arr) {
foreach ($arr as $value) {
echo "color ". $value[1] ."<br>";
echo "number ". $value[0] ."<br>";
}
}
sample_function( test() );
但是使用这样的数组会使您的代码难以阅读。您可以使用list
函数创建数组中值的命名引用。
function sample_function($arr) {
foreach ($arr as $value) {
list($number, $color) = $value;
echo "color ". $color. "<br>";
echo "number ". $number ."<br>";
}
}
sample_function( test() );
您还可以使用字符串插值来提高回声的可读性。请注意,这仅适用于使用双引号"
字符串而非单引号'
字符串的情况。
function sample_function($arr) {
foreach ($arr as $value) {
list($number, $color) = $value;
echo "color {$color}<br>";
echo "number {$number}<br>";
}
}
sample_function( test() );
最后,您可以在原始数据结构中使用关联数组,以便于理解数据并更轻松地使用它。
function test() {
return array (
array('number'=>'1', 'color'=>'red'),
array('number'=>'2', 'color'=>'blue'),
array('number'=>'3', 'color'=>'green'),
array('number'=>'4', 'color'=>'yellow')
);
}
function sample_function($arr) {
foreach ($arr as $row) {
foreach ($row as $key => $value) {
echo "{$key} {$value}<br>";
}
}
}
sample_function( test() );
答案 4 :(得分:0)
从我收集的内容中,您希望访问和操作在外部函数的数组。
两种方法包括:
将数组放入全局空间并按引用调用。要执行此操作,请在函数参数中的&
之前添加&符号$
。
在您的功能中使用global
关键字。
<?php
$array = array(
array('1','red'),
array('2','blue'),
array('3','green'),
array('4','yellow')
);
function output_array($array) {
$out = '';
foreach ($array as $arr) {
$out .= 'number: ' . $arr[0] . ' - color: ' . $arr[1] . '<br />';
}
return $out;
}
function modify_array_reference(&$array) {
$array[0][1] = 'purple';
}
function modify_array_global() {
global $array;
$array[0][1] = 'orange';
}
echo output_array($array) . '<br />';
modify_array_reference($array);
echo output_array($array) . '<br />';
modify_array_global();
echo output_array($array) . '<br />';
number: 1 - color: red
number: 2 - color: blue
number: 3 - color: green
number: 4 - color: yellow
number: 1 - color: purple
number: 2 - color: blue
number: 3 - color: green
number: 4 - color: yellow
number: 1 - color: orange
number: 2 - color: blue
number: 3 - color: green
number: 4 - color: yellow