如何在PHP的数组中实现这一点
我在使用数组实现这个结果时遇到问题,我想用第一个数组中的数据更新另一个空数组,这样前两行被删除,前3行被添加到空数组的索引0中,接下来的3行也被更新到第二个索引中,依此类推。我有这个数组如何在PHP的数组中实现这一点,php,arrays,loops,Php,Arrays,Loops,我在使用数组实现这个结果时遇到问题,我想用第一个数组中的数据更新另一个空数组,这样前两行被删除,前3行被添加到空数组的索引0中,接下来的3行也被更新到第二个索引中,依此类推。我有这个数组 `$arr = [ 'tqty' => 9, 'tPrice' => 18700, 'food_name_1' => 'Black Coffee', 'food_quanty_1' => 1, 'food_price_1' => 1000,
`$arr = [
'tqty' => 9,
'tPrice' => 18700,
'food_name_1' => 'Black Coffee',
'food_quanty_1' => 1,
'food_price_1' => 1000,
'food_name_2' => 'Sub Combo',
'food_quanty_2' => 2,
'food_price_2' => 3000
];`
我想使用这个数组数据并以这种方式更新另一个空数组,删除前两行
$arr2 = [
0 => [
'food_name_1' => 'Black Coffee',
'food_quanty_1' => 1,
'food_price_1' => 1000
],
1 => [
'food_name_2' => 'Sub Combo',
'food_quanty_2' => 2,
'food_price_2' => 3000
]
];
这是到目前为止我的代码
$arr = [
'tqty' => 9,
'tPrice' => 18700,
'food_name_1' => 'Black Coffee',
'food_quanty_1' => 1,
'food_price_1' => 1000,
'food_name_2' => 'Sub Combo',
'food_quanty_2' => 2,
'food_price_2' => 3000
];
$newdat = [];
$count = 0;
$oldcount = 1;
foreach($arr as $key => $value){
if(preg_match_all('!\d+!', $key, $matches)){
if($oldcount == $matches[0][0]){
$newdat[$matches[0][0]] = [
$count => [
$key => $value
]
];
} else{
$count = 0;
$oldcount = $matches[0][0];
}
}
$count++;
}
我希望能尽快得到帮助。谢谢假设数组键和顺序保持一致,您可以使用
array\u chunk
<?php
$inArray = [
'tqty' => 9,
'tPrice' => 18700,
'food_name_1' => 'Black Coffee',
'food_quanty_1' => 1,
'food_price_1' => 1000,
'food_name_2' => 'Sub Combo',
'food_quanty_2' => 2,
'food_price_2' => 3000,
];
$outArray = [];
// Remove first 2 values.
$inArray = array_slice( $inArray, 2 );
// 'Chunk' the rest of the values.
// true preserves keys.
$outArray = array_chunk( $inArray, 3, true );
echo '<pre>' . print_r( $outArray, true ) . '</pre>';
/**
Output:
<pre>Array
(
[0] => Array
(
[food_name_1] => Black Coffee
[food_quanty_1] => 1
[food_price_1] => 1000
)
[1] => Array
(
[food_name_2] => Sub Combo
[food_quanty_2] => 2
[food_price_2] => 3000
)
)
</pre>
*/
这里有一个解决方案,可以在末尾找到\ux
来检查它的a位
此解决方案不关心您有多少未编号的字段,或者每个编号的“行”有多少字段,它们也基于\u x
编号进行索引
<?php
$arr = [
'tqty' => 9,
'tPrice' => 18700,
'food_name_1' => 'Black Coffee',
'food_quanty_1' => 1,
'food_price_1' => 1000,
'food_name_2' => 'Sub Combo',
'food_quanty_2' => 2,
'food_price_2' => 3000
];
foreach(array("food_name_","food_quanty_","food_price_") as $v){
// replace the set value of 2 here with a count() on the $arr
// and some basic math - IF you are always sure you'll have 3 fields
for($i=0;$i<2;$i++){
$newarr[$i][$v.($i+1)]=$arr[$v.($i+1)];
}
}
print_r($newarr);
?>
输出:
Array
(
[1] => Array
(
[food_name] => Black Coffee
[food_quanty] => 1
[food_price] => 1000
)
[2] => Array
(
[food_name] => Sub Combo
[food_quanty] => 2
[food_price] => 3000
)
)
$newdata = array();
for ($i = 1; $i++;) { // Intentionally no condition set.
if (array_key_exists('food_name_' . $i, $arr)) {
$temparray = array();
$temparray['food_name_' . $i] = $arr['food_name_' . $i];
if (array_key_exists('food_quanty_' . $i, $arr)) {
$temparray['food_quanty_' . $i] = $arr['food_quanty_' . $i];
}
if (array_key_exists('food_price_' . $i, $arr)) {
$temparray['food_price_' . $i] = $arr['food_price_' . $i];
}
$newdata[] = $temparray;
} else {
break; // break out of the loop
}
}
echo "<pre>";
print_r($newdata);
echo "</pre>";
die();
循环遍历它,并通过变量构建数组索引字符串
$keys = array_keys($arr);
echo '<br><br>'.$arr[$keys[1]];
如果我理解正确
$keys = array_keys($arr); #stores the associative keys by index
$arr2 = array();
/* For each array $arr do the following */
$limit = 5; #substitute this with: count($arraylist)
for( $n_array=0; $n_array<limit; $n_array++ ){
$cur_arr = array(); #substitute with your: $arraylist[ $n_array ]
for( $a = 2; $a<count($arr); $a++ ){
$cur_arr[ $keys[$a] ] = $arr[ $keys[$a] ];
}
$arr2[ $n_array ] = $cur_arr;
}
$newdata=array();
对于($i=1;$i++;){//,未设置任何条件。
如果(数组\u键\u存在('food\u name.$i,$arr)){
$temparray=array();
$temparray['food_name.'$i]=$arr['food_name.'$i];
如果(数组键存在('food\u quantity.$i,$arr)){
$temparray['food_quantity.'$i]=$arr['food_quantity.$i];
}
如果(数组\键\存在('food\ u price.$i,$arr)){
$temparray['food_price.'$i]=$arr['food_price.$i];
}
$newdata[]=$temparray;
}否则{
break;//中断循环
}
}
回声“;
打印(新数据);
回声“;
模具();
如果您已经知道需要始终使用$arr中的相同索引,则可以使用array\u keys函数为关联数组编制索引。
示例:
$keys=array\u keys($arr);
回显“
”.$arr[$keys[1]];
下面是一个完整的示例:
$keys=array\u keys($arr)#按索引存储关联键
$arr2=数组();
/*对于每个数组$arr,请执行以下操作*/
$limit=5#将其替换为:count($arraylist)
对于$ nnAlgay= 0;$nayalayCAN源代码有更多的密钥,如<代码> FooLoNAMEY3/COD>和相应的数据……?@ 9kStand,是的,数据是发送数据HTML表单,根据用户输入的数字自动生成,您可能会考虑重新命名表单输入,如<代码> name =“食物(1)名称””。
等等。这样你就可以从一个更有用的数组开始,避免这种操作。很好的一点是@Don'tPanic知道数据的来源本可以让你有更好的问题/答案。现在在这个线程中有很多选项,但是使用一种解决方案,让你的代码能够容忍对数据结构的更改。我基于p我在数据分组的键结构中看到了模式,但没有任何位置。嗯,你是想使用array\u splice
?(我认为array\u slice
不会删除任何内容。)不,我的意思是使用array\u slice
。技术上你是对的,它不会删除任何内容,而是返回一个新的数组。我很喜欢它的简单性,+1对源数组的过多信任只会在缺少键或重新排列/排序键时导致错误,顺便说一句,这种情况比我们估计的要频繁得多。:)注意:我已经更新了我的代码:)令人惊讶的是,我错过了array\u key\u exists
的语法,现在是早上4:30。我想我现在应该睡觉了D
$keys = array_keys($arr); #stores the associative keys by index
$arr2 = array();
/* For each array $arr do the following */
$limit = 5; #substitute this with: count($arraylist)
for( $n_array=0; $n_array<limit; $n_array++ ){
$cur_arr = array(); #substitute with your: $arraylist[ $n_array ]
for( $a = 2; $a<count($arr); $a++ ){
$cur_arr[ $keys[$a] ] = $arr[ $keys[$a] ];
}
$arr2[ $n_array ] = $cur_arr;
}