php 横向循环,php实现数组纵向转横向并过滤重复值的方法分析

本文实例讲述了php实现数组纵向转横向并过滤重复值的方法。分享给大家供大家参考,具体如下:

一、问题

有数组:

array(

6=>array(5=>'黑xx', 42=>'XXL'),

7=>array(5=>'黑xx', 40=>'XL'),

8=>array(8=>'灰', 40=>'XL'),

);

要求转换成如下结果(数组纵向转横向并过滤重复值):

array(

0=>array(5=>'黑xx', 8=>'灰'),

1=>array(42=>'XXL', 40=>'XL'),

);

二、解决方法:

方法1:

$a = array(

6=>array(5=>'黑xx', 42=>'XXL'),

7=>array(5=>'黑xx', 40=>'XL'),

8=>array(8=>'灰', 40=>'XL'),

);

foreach($a as $r) {

$b[key($r)] = current($r);

next($r);

$c[key($r)] = current($r);

}

$b = array($b, $c);

print_r($b);

方法2:

$arr = array(

6=>array(5=>'黑xx', 42=>'XXL'),

7=>array(5=>'黑xx', 40=>'XL'),

8=>array(8=>'灰', 40=>'XL'),

);

$result = array();

foreach($arr as $a){

$keys = array_keys($a);

$vals = array_values($a);

$result[0][$keys[0]] = $vals[0];

$result[1][$keys[1]] = $vals[1];

}

print_r($result);

最简单的写法:

$a = array(

6=>array(5=>'黑xx', 42=>'XXL'),

7=>array(5=>'黑xx', 40=>'XL'),

8=>array(8=>'灰', 40=>'XL'),

);

foreach($a as $r) {

$i = 0;

while(list($k, $v) = each($r)) $b[$i++][$k] = $v;

}

print_r($b);

最终运行结果均为:

Array

(

[0] => Array

(

[5] => 黑xx

[8] => 灰

)

[1] => Array

(

[42] => XXL

[40] => XL

)

)

希望本文所述对大家PHP程序设计有所帮助。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是使用数组实现汉诺塔移动过程的C++代码,包括横向纵向显示移动过程: ```c++ #include <iostream> using namespace std; const int MAXN = 100; int n; // 汉诺塔的层数 char a[MAXN], b[MAXN], c[MAXN]; // a,b,c三个塔 int cnt = 0; // 移动次数 // 将第n个盘子从a柱移动到c柱 void move(char a[], char b[], char c[], int n) { if (n == 1) { // 只有一个盘子,直接移动 cnt++; c[++c[0]] = a[a[0]--]; // 横向显示 cout << "Move " << cnt << ": "; for (int i = 1; i <= n; i++) { cout << a[i] << " "; } cout << "-> "; for (int i = 1; i <= n; i++) { cout << c[i] << " "; } cout << endl; // 纵向显示 for (int i = n; i >= 1; i--) { for (int j = 1; j <= 3; j++) { if (a[i] == 'A' && j == 1) { cout << " " << a[i] << " "; } else if (b[i] == 'B' && j == 2) { cout << " " << b[i] << " "; } else if (c[i] == 'C' && j == 3) { cout << " " << c[i] << " "; } else { cout << " "; } } cout << endl; } cout << endl; } else { // 先将n-1个盘子从a柱移动到b柱 move(a, c, b, n - 1); // 再将第n个盘子从a柱移动到c柱 move(a, b, c, 1); // 最后将n-1个盘子从b柱移动到c柱 move(b, a, c, n - 1); } } int main() { // 输入汉诺塔层数 cout << "Please input the number of disks:"; cin >> n; // 初始化汉诺塔 a[0] = n; for (int i = 1; i <= n; i++) { a[i] = 'A'; b[i] = 'B'; c[i] = 'C'; } // 显示初始状态 cout << "Initial State:" << endl; for (int i = n; i >= 1; i--) { for (int j = 1; j <= 3; j++) { if (a[i] == 'A' && j == 1) { cout << " " << a[i] << " "; } else if (b[i] == 'B' && j == 2) { cout << " " << b[i] << " "; } else if (c[i] == 'C' && j == 3) { cout << " " << c[i] << " "; } else { cout << " "; } } cout << endl; } cout << endl; // 开始移动汉诺塔 move(a, b, c, n); // 显示移动次数 cout << "Total moves: " << cnt << endl; return 0; } ``` 在横向显示移动过程时,每次移动一个盘子后,都会显示当前三个塔的状态。 在纵向显示移动过程时,每次移动一个盘子后,都会显示当前三个塔的状态,其中用空格表示该位置没有盘子,用字母A、B、C表示该位置有盘子,字母的大小表示盘子的大小。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值