2011-01-02 5 views
1

I次の配列を持っている:PHPの変更アレイ

array(a, a, a, b, b, c, c, c, c, d, d); 

とき、私それをループし、それが、結果はエコー:私は、このような方法でそれをエコーし​​たいどのようにこれまで

a 
a 
a 
b 
b 
c 
c 
c 
c 
d 
d 

それが表示される:ここで

a 
b 
c 
d 
a 
b 
c 
d 
a 
c 
c 

は、より良いイム

を達成しようとしているかを説明するためのグリッドの配列です
Current 
a a a b 
b c c c 
c d d 

What im tryin to do 
a b c d 
a b c d 
a c c 

どうすればよいですか?あなたの答えのいくつかを見て

、その明確な私は十分にそれを説明するのdidnt:/

私は配列のキーがどのように見えるか含まれている必要があります。HERESに私は必要か

0a 1a 2a 3b 
4b 5c 6c 7c 
8c 9d 10d 

0a 3b 6c 9d 
1a 4b 7c 10d 
2a 5c 8c 

キーで整理される配列

0a 
1a 
2a 
3b 
4b 
5c 
6c 
7c 
8c 
9d 
10d 

0a 
3b 
6c 
9d 
1a 
4b 
7c 
10d 
2a 
5c 
8c 
+1

はあなたのニーズを満たすだろうアルゴリズムを持っています。あなたはそれを作成しましたか? –

+0

私はアルゴリズムの周りに頭を浮かべることができません:私は何かナップザックの問題とは何かが必要だろうと考えているが、それを実装する方法は考えていないだろう – Ozzy

答えて

1

私が正しくあなたの仕様を理解している場合、これは動作するはずです:

<?php 

function magicFunction($input) { 
    $output = array(); 

    sort($input); 

    $startingCount = count($input); 

    for ($j=0; $j<count($input); $j++) { 
     $lastValue = NULL; 

     for ($i=0; $i<count($input); $i++) { 
      //var_dump($input[$i]); 
      if ($input[$i] !== NULL && $input[$i] !== $lastValue) { 

       $output[] = $input[$i]; 
       $lastValue = $input[$i]; 
       $input[$i] = NULL; 
      } 
     } 
     //echo '<hr />'; 
     if (count($output) == $startingCount) { 
      break; 
     } 
    } 

    return $output; 
} 

$array = array('z','a','a','a','b','b','c','c','c','c','d','d','z'); 

$result = magicFunction($array); 
echo '<pre>' . print_r($result, true) . '</pre>'; 

?> 

が出力できます:

Array 
(
    [0] => a 
    [1] => b 
    [2] => c 
    [3] => d 
    [4] => z 
    [5] => a 
    [6] => b 
    [7] => c 
    [8] => d 
    [9] => z 
    [10] => a 
    [11] => c 
    [12] => c 
) 

を私はそれが簡単に私ができるようにすること、入力配列(2回)にzを追加しましたテスト。

コメント行のコメントを外して、私の機能の仕組みを確認することができます。

この方法(またはこの方法のパフォーマンスの微妙な調整)はおそらくもっと効率的ですが、私はあなたの質問を誤解している可能性があるため、今はあまりにも難しいとは思わないでしょう。とにかく、あなたの入力配列が本当に大量でない限り問題にはなりません。

1

このようなものを使用して、特定のストライド/ウィジェット目:

function rotate_array(&$array, $width) { 
    $newarr = array(); 

    for ($stride = 0; $stride < $width; $stride++) { 
     for ($i = $stride; $i < count($array); $i += $width) { 
      $newarr[] = $array[$i]; 
     } 
    } 

    return $newarr; 
} 

このテストスクリプト:

$arr = array('a', 'a', 'a', 'b', 'b', 'c', 'c', 'c', 'c', 'd', 'd'); 

print_r($arr); 
print_r(rotate_array($arr, 3)); 

ウィル出力この:あなたが望んでいた出力のように見える

Array 
(
    [0] => a 
    [1] => a 
    [2] => a 
    [3] => b 
    [4] => b 
    [5] => c 
    [6] => c 
    [7] => c 
    [8] => c 
    [9] => d 
    [10] => d 
) 
Array 
(
    [0] => a 
    [1] => b 
    [2] => c 
    [3] => d 
    [4] => a 
    [5] => b 
    [6] => c 
    [7] => d 
    [8] => a 
    [9] => c 
    [10] => c 
)

。しかし、あなたの質問から正確にはが不明です。あなたはこの結果が欲しいです。最初のアイテムから3番目のアイテムをすべて表示し、次に2番目のアイテムから始まるすべての3番目のアイテムを表示するように見えます。これがあなたが達成しようとしているものでない場合は、あなたの目標がより明確になるように、より良いサンプルデータを提供してください。

例:このような配列によって

1

ループ配列によって

function noRepeatArray($array){ 
    $lastChar = ""; 
    for($j = 0;$j < count($array);$j++){ 
     for($i = 0;$i < count($array);$i++){ 
      if($array[$i] != $lastChar && strlen($array[$i]) > 0){ 
       echo $array[$i] ."<br />"; 
       $lastChar = $array[$i]; 
       $array[$i] = ''; 
      } 
     } 
     $lastChar = ""; 
    } 
} 

これがループではなく、それはあなたの例では、残された唯一の文字(でない限り、文字が繰り返されることを可能にします、 "c")。

1

別の方法(あなたの例のように、配列がすでにソートされていると仮定):

$vals = array_count_values($array); 
while (!empty($vals)) { 
    foreach ($vals as $key => & $ct) { 
     echo $key . "\n"; 
     if (!--$ct) { 
      unset($vals[$key]); 
     } 
    } 
}