0

私は2つの配列を持っています。1 つ目は、元のデータから直接取得したものです。各アイテムはタイムラインのポイントです。

print_r($items)

戻り値

        Array
(
    [0] => Array
        (
            [id] => 1173
            [month] => January
            [year] => 2013
            [description] => This is a test
            [link] => #
            [image] => http://s3.amazonaws.com/stockpr-test-store/esph2/db/Timeline/1173/image_resized.jpg
        )

    [1] => Array
        (
            [id] => 1183
            [month] => February
            [year] => 2013
            [description] => This is another test
            [link] => 
        )

    [2] => Array
        (
            [id] => 1193
            [month] => December
            [year] => 2012
            [description] => Testing another year
            [link] => #
        )

)

その配列からすべての一意の年を取得する 2 番目の配列があります。

print_r($years) 

戻り値

        Array
(
    [0] => 2013
    [2] => 2012
)

次に、年を経て、その年に一致するアイテムを年ごとに返すにはどうすればよいですか?

したがって、2012 年の場合、$items 配列から [2] を取得します。2013 年の場合、$items 配列から [0] と [1] を取得します。

私はこれですべて間違っていますか?私がやりたいのは、次のような出力を持つことだけです:

<h1>Timeline</h1>
<h2>2013</h2>
<ul>
  <li>ID No. 1173</li>
  <li>ID No. 1183</li>
</ul>
<h2>2012</h2>
<ul>
  <li>ID No. 1193</li>
</ul>

編集:

現在使用中:

<? foreach($years as $year) : ?> 
                <div class="year row clearfix" id="y-$year">
                    <h3><span><?= $year ?></span></h3>
    <? foreach($items as $item) : ?>
         <? if($item['year'] == $year) : ?>
                    <div class="item span5">
                        <div class="padding">
                            <div class="text">
                            <h4><?= $item['month']?> <?= $item['year'] ?></h4>
                            <p><?= $item['description'] ?></p>
                            </div>
                        </div>
                    </div>
         <? endif; ?>
    <? endforeach; ?>
                </div>
<? endforeach; ?>

しかし、それは少し効率が悪いようです。私が理解できることから、アイテムを出力しようとするたびに完全な配列を通過しています。

4

3 に答える 3

1

ねえ、

あなたの質問を正しく理解できたかどうかはわかりませんが、これを試すことができます:

foreach($years as $aYear){ 
   foreach($items as $aItem){
     if($aItem['year'] == $aYear){
        echo $aItem['description'];
      }
   }
}
于 2013-02-15T21:51:19.217 に答える
0

このようなものが動作するはずです:

$years = ['2013','2012'];

for ($i = 0; $i < count($items); $i++) 
{
  if (in_array($years, $items[$i]['year']))
  {
    // do something with $items[$i]
  }
}
于 2013-02-15T21:52:38.833 に答える
0
   //new array
 $array2 = array();
   foreach($array as $key)
   {
    $year =  $array[$key]['year'];
    //if year has already been used dont erase what's already in each part, add to it
   if(array_key_exists($year, $array2))
     {
       array_push($array2[$year]['ids'],$array[$key]['id']);
       //do rest
     }
   else 
     {
       //if year hasnt been set as a key yet, then it's empty
       $array2[$year]['ids'] = array($array[$key]['id']);
       //do rest of your vars to populate it
     }



   }

キーをハードコーディングしたくない場合は、気軽に foreach を使用して、使用されているかどうかを再度確認してください。配列内のすべてのインデックス(例のように)が同じ番号/キーを持っているわけではない可能性がある場合は、ネストされた配列キーが存在することをプッシュする前に再確認する必要があります.(id、description、month)

配列 2 の出力は次のようになります。

Array(
   [2013] => array
   (
       [ids] => array
       ( 
         [0] => 1234
         [1] => 5667
       ) 
      [months] => array
      ( 
         [0] => January
      )
    )

)

うまくいけば、配列がより簡単に操作できるように編成されます。後でテストします。

于 2013-02-15T22:34:37.747 に答える