PHP函数不返回数据

时间:2014-08-28 18:50:06

标签: php return return-value

我有一个由函数创建的数据数组,但该函数不会返回数据。

这是功能:

/**
 * Takes in a legacy id and returns new id.
 */
function my_function($data) {
  foreach ($data as $info) {
    $new_info = my_other_function($info);
    $new_data[] = $new_info;
  }

  return $new_data;
}

以下是它的名称:

$data = array('7245');
echo 'test1';                   // prints out test1
$new_data = my_function($data);
print_r($new_data);                 // DOES NOT PRINT ANYTHING, SAME RESULTS WITH VAR_DUMP()
echo 'test2';                   // prints out test2

但是,如果我将函数更改为以下函数,它会在函数中打印出来,但仍然不会打印出返回的值:

function my_function($data) {
  foreach ($data as $info) {
    $new_info = my_other_function($info);
    $new_data[] = $new_info;
  }
  print_r($new_data);
  return $new_data;
}

现在这样:

$data = array('7245');
echo 'test1';                   // prints out test1
$new_data = my_function($data);
echo 'test2';                   // prints out test2
print_r($new_data);                 // DOES NOT PRINT ANYTHING, SAME RESULTS WITH VAR_DUMP()

打印出来:

test1
array(0=>9876)
test2
// RETURNED VALUE SHOULD BE HERE BUT IT IS NOT

编辑:

因为这似乎是不可能的,所以我添加了原始函数,它存在于Drupal模块中。我已经测试了这个函数中调用的所有其他函数,它们可以完全独立工作。

$file_data = '7024';
$ids = tdm_migration_import_file($file_data, $inline='no');

function tdm_migration_import_file($data, $inline) {
  // create base array
  $new_data = array();
  if (!is_array($data)) {
    $data = array($data);
  }
  // if we are reprocessing this data, remove the first element (flag) of
  // the array
  // dpm($data, 'incoming data');
  if (isset($data['reprocess'])) {
    unset($data['reprocess']);
  }
  foreach ($data as $file_data) {
    if (trim($file_data) == '') {
      continue;
    }
    // check to see if this data is coming from a text block or not
    if ($inline == 'no') {
      // given a path or fid
      if (is_numeric($file_data)) {
        // given an int (fid)
        $legacy_fid = $file_data;
        $legacy_file_path = tdm_migration_get_legacy_file_data($legacy_fid);
        // set the flag to reprocess this data
        $new_data['reprocess'] = 'yes';
        // add file path to new data for reprocessing
        $new_data[] = $legacy_file_path;
      } else {
        // given a string (path or uri/url)
        $legacy_file_path = $file_data;
        $path_data = tdm_migration_extract_path_data($legacy_file_path);
        // // if the directory doesn't exist we create it and make sure permissions
        // allow for writing by the server
        file_prepare_directory($path_data['public_path'], FILE_CREATE_DIRECTORY);
        // check to see if the file already exists in file structure
        $realpath = drupal_realpath($path_data['public_file_path']);
        if (!file_exists($realpath)) {
          // create new file and get new fid
          $fid = tdm_migration_create_file($path_data['legacy_file_url'], $path_data['public_file_path'], $data='fid');
        } else {
          // get the existing file id
          $fid = tdm_migration_get_existing_file_data($path_data['public_file_path']);
        }
        $new_data[] = $fid;
      }
    } else {
      // given a body of text, find <img> tags and extract the src attributes
      $legacy_paths = tdm_migration_extract_img_srcs($file_data);
      $replacement_paths = array();
      foreach ($legacy_paths as $legacy_path) {
        $path_data = tdm_migration_extract_path_data($legacy_path);
        file_prepare_directory($path_data['public_path'], FILE_CREATE_DIRECTORY);
        $realpath = drupal_realpath($path_data['public_file_path']);
        if (!file_exists($realpath)) {
          $new_path = tdm_migration_create_file($path_data['legacy_file_url'], $path_data['public_file_path'], $data='path');
        } else {
          $new_path = $public_file_path;
        }
        // aggregate old and new paths
        $replacement_paths[$legacy_path] = $new_path;
      }
      // replace all old paths with new paths in original text
      $new_file_data = tdm_migration_replace_text($file_data, $replacement_paths);
      $new_data[] = $new_file_data;
    }
  }
  if (isset($new_data['reprocess']) && $new_data['reprocess'] == 'yes') {
    // dpm($new_data, 'reprocessing');
    tdm_migration_import_file($new_data, $inline='no');
  } else {
    dpm($new_data, 'new-data'); // THIS PRINTS OUT!!!!!!
    return $new_data;
  }
}

EDIT2:关于这是做什么似乎有些混乱,所以我将用简单的英语解释这些步骤。

  1. $ data =&#39; 7204&#39 ;;数据变量被设置为一串数字
  2. 将$数据放入数组中,也称为$ data。
  3. 检查密钥是否重新处理&#39;在$ data中设置,如果是,则删除它
  4. 通过$ data数组,现在称为$ file_data的数组的各个元素(此函数根据迁移需求下载文件)。
  5. 如果元素为空白,请跳过它并转到下一个元素
  6. 检查$ inline变量是否已设置,如果我们正在处理HTML(不是手头的问题)在这种情况下,数据是一串数字。 $ inline永远不会设置为&#39;是&#39;。
  7. 检查元素是否为数字,在本例中为IT IS NUMERIC
  8. 使用tdm_migration_get_legacy_file_data()获取存储在旧数据库中的相对路径。新数据类似于:sites / default / files / somefile.jpg
  9. 在new_data
  10. 中将rerocess设置为yes
  11. 将返回的文件路径添加到new_data数组。
  12. 现在函数用最后一个if / else转到底部并检查是否重新处理isset以及它是否等于yes - 在这种情况下是IT!
  13. 由于rerocess等于yes,我们使用给定的字符串(路径)再次运行该函数!
  14. UNSET重新处理!
  15. 再次浏览数据
  16. 不是内联
  17. 不是数字! SO REPROCESS现在从未设置过!!!
  18. 获取路径数据(返回新服务器路径等内容) - 已验证正常工作
  19. 准备具有写入权限的目录,如果它不存在则创建该目录
  20. 检查服务器上是否已存在该文件
  21. 如果没有,则创建文件并通过运行tdm_migration_create_file()将文件信息添加到数据库,该文件返回文件ID($ fid)。 - 已验证的工作 - 如果确实存在,则只检查数据库中的文件ID - 已验证正常工作
  22. 将文件ID添加到$ new_data。
  23. 现在位于函数的底部,它转到 ELSE,因为REPROCESS未设置并且应该返回数据
  24. 这最后一部分是错的。如果添加行dpm($ new_data,&#39; new-data&#39;);在返回之前,它会准确打印出应该返回的内容。对于没有经验的人来说,dpm是一个以干净的格式输出数据的drupal fucntion。如果它将dpm行更改为var_dump($ new_data);死(); - 它仍然打印数据,但功能不会返回它!

1 个答案:

答案 0 :(得分:2)

您的功能不会在此处返回数据!

  ...
  if (isset($new_data['reprocess']) && $new_data['reprocess'] == 'yes') {
    // vvvvvvvvvvvvvvvvvvvvv
    tdm_migration_import_file($new_data, $inline='no');
    // ^^^^^^^^^^^^^^^^^^^^^
  } else {
    return $new_data;
  }

函数再次调用自身并不重要。它可以调用任何函数,这是无关紧要的。这里没有return语句,因此如果函数进入if分支,则该函数不返回数据。解决它:

 return tdm_migration_import_file($new_data, $inline='no');

非常典型的新手递归调用错误。


显然我需要更明确地为什么这不会像您想象的那样起作用。首先:递归没什么特别的!你只是在调用一个函数。它与你目前所处的功能并不重要。在这种情况下没有特殊的魔法。

采用这个示例函数:

function foo() {
    if (rand(0, 1)) {
        bar();
    } else {
        return true;
    }
}

此功能只会在一半的时间内返回true。另一半,它会调用一个函数bar来执行who-know-what,但它不会从该调用中返回任何值。

现在用bar()替换foo()。它没有改变我上面描述的行为。该函数仍将只返回数据的一半时间。如果没有return语句,则不返回数据。干净利落。甚至不是来自递归调用。

递归调用函数不会“重启”函数,它会创建另一个函数调用,其规则与任何其他函数调用相同。如果rerocess等于yes,period,则函数不返回数据。