我有一个由函数创建的数据数组,但该函数不会返回数据。
这是功能:
/**
* 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:关于这是做什么似乎有些混乱,所以我将用简单的英语解释这些步骤。
这最后一部分是错的。如果添加行dpm($ new_data,&#39; new-data&#39;);在返回之前,它会准确打印出应该返回的内容。对于没有经验的人来说,dpm是一个以干净的格式输出数据的drupal fucntion。如果它将dpm行更改为var_dump($ new_data);死(); - 它仍然打印数据,但功能不会返回它!
答案 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,则函数不返回数据。