从var_export中删除数字数组键

9

我想使用var_export()函数并去掉数组中所有数字键。我的数组输出如下:

array (
  2 => 
  array (
    1 => 
    array (
      'infor' => 'Radiation therapy & chemo subhead',
      'PPOWithNotif' => '',
      'PPOWithOutNotif' => 'Radiation therapy & chemo PPO amount',
      'NonPPO' => 'Radiation therapy & chemo Non PPO amount',
    ),
  ),
  3 => 
  array (
    1 => 
    array (
      'infor' => 'Allergy testing & treatment subhead',
      'PPOWithNotif' => '',
      'PPOWithOutNotif' => 'Allergy testing & treatment PPO amount',
      'NonPPO' => 'Allergy testing & treatment Non PPO amount',
    ),
  )
)

通过这种方法,我可以随意地打乱数组的值,而无需担心数字数组值的情况。
我尝试使用echo preg_replace("/[0-9]+ \=\>/i", '', var_export($data));,但它没有任何作用。您有什么建议吗?我的正则表达式是否有问题?总体上,是否有更好的解决方案?

你能更清楚地说明你最终想要做什么吗?比如,数组的前后状态或者你想从中获取什么?因为如果你把 var_export() 当作数组的字符串表示,那么它就不再是一个可以随机排序的数组了。 - CrayonViolent
我想从这个字符串中移除数字数组键。 - Ben
没错,我明白了,但是你接着谈到洗牌数组值。如果你使用 var_export 将数组转换为字符串,它就不再是一个数组了,你根本无法对其进行洗牌,因为它不再是一个数组,而是一个字符串。 - CrayonViolent
4个回答

3
你需要将var_export的第二个参数设置为true,否则你的preg_replace调用将不会有返回值。
参考: https://php.net/manual/function.var-export.php

return
如果使用并设置为truevar_export()将返回变量表示而不是输出它。


更新:回顾这个问题,我有一个简单的想法,只需使用array_values($input)即可。

6
示例代码如下: <?php $export = preg_replace('(\d+\s=>)', "", var_export($arr, true)); 该代码的功能是将数组 $arr 导出为字符串,并去除其中所有数字加空格加箭头符号(如"1 =>")的部分。 - Lucas Souza
array_values会重新索引数组,但我认为目标只是避免var_export添加显式数字索引。 - Anthony
使用 preg_replace()(或任何字符串操作)的风险是它可能过度匹配。如果任何值(不是键后跟箭头)包含符合条件的文本,它们也将被替换。所有研究人员都需要意识到这个漏洞应该是一个问题。 - mickmackusa

0

这个包可以解决问题 https://github.com/brick/varexporter

use Brick\VarExporter\VarExporter;
echo VarExporter::export([1, 2, ['foo' => 'bar', 'baz' => []]]);

输出:

[
    1,
    2,
    [
        'foo' => 'bar',
        'baz' => []
    ]
]

这是否会删除 所有 数字键?还是只删除索引?您的示例仅删除索引,而 OP 的示例键是数字但不是索引。这只是一个值得澄清的歧义。 - mickmackusa
这里有两件事情,var_export总是给出带有数字键的输出,并且由该软件包解决。但是当你洗牌时,键会改变,无论是var_export还是这个软件包都能够移除它,因为键不是按顺序排列的。因此,在 suffle 之后必须重置键以获得没有数字键的输出。 - Mahbubur Rahman
好的,你的意思是它会删除索引,但不会删除 int 类型的关联键。谢谢你的澄清。 - mickmackusa

0

也许不是你想要的答案,但如果你有一个一维数组,你可以使用下面的函数。它可能不太美观,但对我来说效果很好。

function arrayToText($array, $name = 'new_array') {
  $out = '';
  foreach($array as $item) {
    $export = var_export($item, true);
    $export = str_replace("array (\n", '', $export);
    $export = substr($export, 0, -1);
    $out .= "[\n";
    $out .= $export;
    $out .= "],\n";
  }
  return '$' . $name . ' = ' . "[\n" . substr($out, 0, -2) . "\n];";
}

echo arrayToText($array);

-3

为什么不直接使用{{link1:array_rand}}呢:

 $keys = array_rand($array, 1);
 var_dump($array[$keys[0]]); // should print the random item

PHP还有一个函数,shuffle,它可以为您洗牌数组,然后使用foreach循环或next/each方法以随机顺序将其提取出来。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接