我需要在平面文件中存储多维关联数据数组以用于缓存目的.我偶尔会遇到将其转换为JSON以便在我的Web应用程序中使用的需要,但绝大多数时候我将直接在PHP中使用该数组.
将数组作为JSON或PHP序列化数组存储在此文本文件中会更有效吗?我环顾四周,似乎在最新版本的PHP(5.3)中,json_decode
实际上比它更快unserialize
.
我目前倾向于将数组存储为JSON,因为我觉得如果有必要,人们可以更容易地阅读它,它可以在PHP和JavaScript中轻松使用,而且从我读过的,它甚至可能是更快解码(不确定编码).
有谁知道任何陷阱?任何人都有良好的基准来展示这两种方法的性能优势?
所以$ array是一个数组,其中所有元素都是引用.
我想将这个数组追加到另一个名为$ results的数组(在循环中),但由于它们是引用,PHP复制引用,$ results充满了相同的元素.
到目前为止,最佳工作解决方案是:
$results[] = unserialize(serialize($array));
Run Code Online (Sandbox Code Playgroud)
我担心这会非常低效.有一个更好的方法吗?
我有以下代码:
$data['x'] = $this->x->getResults();
$data['y'] = $data['x'];
//some code here to modify $data['y']
//this causes (undesirably) $data['x] to be modified as well
Run Code Online (Sandbox Code Playgroud)
我猜因为$ data的所有元素都是引用,修改$ data ['y']也会修改$ data ['x'] ..这不是我想要的.我希望$ data ['x']保持不变.有没有办法取消引用这里的元素,以便我可以按值复制元素?
谢谢.
更新:$ this-> x-> getResults(); 返回一个对象数组.所以我可以做类似的事情:$ data ['x'] [0] - > date_create ...
更新:我最近克隆数组的尝试看起来像这样:
$data['x'] = $this->x->getResults();
$data['y'] = $data['y'];
foreach($data['x'] as $key=>$row) {
$data['y'][$key]->some_attr = clone $row->some_attr;
}
Run Code Online (Sandbox Code Playgroud)
我离开这里了吗?我一直得到一个"非对象调用的__clone方法"错误.从阅读响应看来,我最好的选择是迭代每个元素并克隆它(这是我试图用该代码做的事情......).
更新:刚刚解决了!:在foreach循环中我只需要将行更改为:
$data['y'][$key] = clone $row;
Run Code Online (Sandbox Code Playgroud)
它的工作原理!感谢大家的帮助.
我有2个阵列.
$result = array();
$row = array();
Run Code Online (Sandbox Code Playgroud)
Row的元素都是引用,并且不断变化.对于每次迭代,$row
我想将行的值复制到条目$result
而不是引用.
我找到了一些解决方案,但它们看起来都很糟糕.
$result[] = unserialize(serialize($row));
$result[] = array_flip(array_flip($row));
Run Code Online (Sandbox Code Playgroud)
上面的两个工作,但似乎是很多不必要和丑陋的代码只是通过值复制引用数组的内容,而不是复制引用本身.
有没有更清洁的方法来实现这一目标?如果不是最有效的方式是什么?
谢谢.
编辑:如下所示,例如:
function dereference($ref) {
$dref = array();
foreach ($ref as $key => $value) {
$dref[$key] = $value;
}
return $dref;
}
$result[] = dereference($row);
Run Code Online (Sandbox Code Playgroud)
也有效,但看起来同样丑陋.
$arr = array(1);
$a = & $arr[0];
$arr2 = $arr;
$arr2[0]++;
echo $arr[0],$arr2[0];
// Output 2,2
Run Code Online (Sandbox Code Playgroud)
你能帮我一下,怎么可能?
php ×5
arrays ×3
deep-copy ×2
codeigniter ×1
copy ×1
dereference ×1
json ×1
performance ×1
pointers ×1
reference ×1
shallow-copy ×1