如何在PHP的数组中实现这一点

如何在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,

我在使用数组实现这个结果时遇到问题,我想用第一个数组中的数据更新另一个空数组,这样前两行被删除,前3行被添加到空数组的索引0中,接下来的3行也被更新到第二个索引中,依此类推。我有这个数组

`$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;
}