2012-04-09 4 views
1

PHPの配列は非常に柔軟で便利です。私は30以上の配列関数on the PHP.net array referenceページを数えました。それらのうちのいくつかは私の問題を解決することができますが、私は最高の、最もエレガントな方法を探しています。ネストされた配列を交差するときに使用する最適なPHP配列関数は何ですか?

私は2つの配列を持っているが、各テーブルを含む、laborcostと呼ばれる:

labor = array(
    0 => array('date' => date, 'labor'=> labor), 
    1 => array('date' => date, 'labor'=> labor), 
    ... 
); 

cost = array(
    0 => array('date' => date, 'cost'=> cost), 
    1 => array('date' => date, 'cost'=> cost), 
    ... 
); 

私の問題は時々日付の数が(つまり、あなたが負担してきた日があると一致していないということですたとえあなたが労働に費やさなかったとしても、労務費はかかりませんでしたが)コストがかかりませんでした。つまり、1つの配列に次の行があり、次の列には、count()を使用せずにどれがあるかを知る方法がありません。私が興味を持って何

両方の労働力を持っていたとの費用がかかり、私は配列で終わるしたい唯一の日です:私はarray_intersect()または「uのいずれかを使用して考えた

laborcost = array(
    0 => array('date' => date, 'labor'=> labor, 'cost' => cost), 
    1 => array('date' => date, 'labor'=> labor, 'cost' => cost), 
    ... 
) 

'機能が完全に混ざり合った。私自身の配列スキャン機能をあきらめて書き込む前に、1行、おそらく2行のコード行で問題を解決するアイデアがあるかどうかを見たいと思っていました。

+0

'array_map()'を試しましたか? –

+0

うん、 'array_map'。私はクラスを作成し、コンストラクタに1つの配列を与えて保存し、次にクラスの別のメソッドを 'array_map'のコールバックとして使用します。これには2番目の配列を渡すことができます。 – halfer

+0

array_mapをまだ見ていない - それを見てみましょう。ありがとう! –

答えて

2

配列を変更できるユーザー定義の比較関数を受け入れる交差関数はありません。最も簡単な方法はあなた自身で行うことです。

O(2N + M)

// Remap dates as keys for faster lookups 
$result = $nlabor = $ncost = array(); 
foreach ($labor as $l) $nlabor[$l['date']] = $l; 
foreach ($cost as $c) $ncost[$c['date']] = $c; 

// Compare 
foreach ($nlabor as $date => $l) { 
    if (array_key_exists($date, $ncost)) { 
     $result[] = array_merge($l, $ncost[$date]); 
    } 
} 

〜最善な方法はO(n×m個)

// Just compare them all 
$result = array(); 
foreach ($labor as $l) { 
    foreach ($cost as $c) { 
     if ($l['date'] == $c['date']) { 
      $result[] = array_merge($l, $c); 
      break; 
     } 
    } 
} 

:ここ

は、いくつかの例であり、各配列にいくつの要素があるかによって異なります。より小さい配列〜O(n * m)で使用すると、より大きい配列の上にあるときO(2n + m)が効率的になります。

+0

これは、array_関数でビルドされたPHPを使用したいと思っていませんが、計算の答えが必要です。 –

+0

あなたがしたいことをするための組み込み関数はありません。全ての 'array_u *'関数は配列を変更することを許さず、 'array_map'と' array_walk'は基本的には上記と同じことをより複雑な方法で行います。 – netcoder

0

これはそのトリックを行う必要があります。単一の関数と同じくらい単純ではありません。

$merge = array(); 

for ($i = 0; $i < count($labor); $i++) { 
    array_push($merge, array_merge($labor[$i],$cost[$i])); 
} 
+0

助けてください - 労力よりもコストがかかる場合はどうしたらいいですか?日付が一致しないとどうなりますか?私はマージされた配列だけでなく、日付のマッチングが必要です。 –

関連する問題