是否可以通过在函数中声明它来传递多维数组?更好的只是宣布它是全球性的?

时间:2016-07-06 07:12:57

标签: php function arrays foreach

下午好,

我一直试图找出构建一个数组,用于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的访问权限?

谢谢!

5 个答案:

答案 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

另一个解决方案(我先给出的)是: -

https://eval.in/601102

答案 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)

从我收集的内容中,您希望访问和操作外部函数的数组。

两种方法包括:

  1. 将数组放入全局空间并按引用调用。要执行此操作,请在函数参数中的&之前添加&符号$

  2. 在您的功能中使用global关键字。

  3. <?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