1

ifステートメントに応じて、既存の配列にkey=>valueのペアを追加したいと思います。ただし、key=>valueペアを新しいインデックスとして追加し続けます。

これが私のコードです:

foreach ($messageRepo as $oneMessage) {
        $calculatedTime = $oneMessage->getTimeToLive();
        $creationTime = $oneMessage->getCrdate();

        $calculatedTimes = $this->androidService->renderFormat($calculatedTime);
        $expiringDate = $creationTime + $calculatedTime;

        $ausgabe[] = array(
            'Time' => key($calculatedTimes),
            'Format' => current($calculatedTimes),
            'Title' => $oneMessage->getMessageTitle(),
            'Text' => $oneMessage->getMessageText(),
            );

        if (time() > $expiringDate) {
           array_push($ausgabe[]['Expired'], $expiringDate);

            } else {
            array_push($ausgabe[]['Expiring'], $expiringDate);
            }   
    }

ダンプは言う:

    array(60 items)
0 => array(4 items)
  Time => 0 (integer)
  Format => 'Stunden' (7 chars)
  Title => '3 wochen total neu' (18 chars)
  Text => 'dfdsfsdf fgdsfgdsgf' (19 chars)
1 => array(1 item)
  Expired => NULL

しかし、私Expired => NULLは新しいインデックスではなく、元のインデックスのフィールドとして必要です。

4

3 に答える 3

3

この場合は使用array_pushしないでください。代わりに単純な代入を使用してください。追加する要素のインデックスがわからないため、新しい配列を作成し、そのすべての値を設定してから、配列全体に追加できます。このようなもの:

foreach ($messageRepo as $oneMessage) {
        $calculatedTime = $oneMessage->getTimeToLive();
        $creationTime = $oneMessage->getCrdate();

        $calculatedTimes = $this->androidService->renderFormat($calculatedTime);
        $expiringDate = $creationTime + $calculatedTime;

        $newval = array(
            'Time' => key($calculatedTimes),
            'Format' => current($calculatedTimes),
            'Title' => $oneMessage->getMessageTitle(),
            'Text' => $oneMessage->getMessageText(),
            );

        if (time() > $expiringDate) {
           $newval['Expired'] = $expiringDate;
        } else {
           $newval['Expiring'] = $expiringDate;
        }   

        $ausgabe[] = $newval;
}
于 2013-01-22T12:45:08.297 に答える
1

同じことをする表記法とarray_push 一緒に使用しています。$array[]最終結果は、新しい要素を作成し、それを配列として扱い別の新しい要素を内部に配置することです。

array_push直接使用する必要はありません。次のようなものを使用する必要があります。

// This is what the new array inside $ausgabe will look like
$newItem = array(
        'Time' => key($calculatedTimes),
        'Format' => current($calculatedTimes),
        'Title' => $oneMessage->getMessageTitle(),
        'Text' => $oneMessage->getMessageText(),
        );

if (...) {
    // conditionally add more elements
    $newItem['Expired'] = $expiringDate;
}

// Push the final result into $ausgabe
$ausgabe[] = $newItem;

中途半端な新しい配列を に挿入すると、$ausgabe後でサブ要素を追加したいときに新しい配列を参照するキーがわからないため、問題が発生します。動的に見つけることもできますが、それは手間がかかりすぎて何のメリットもありません。

于 2013-01-22T12:43:07.200 に答える
0

Edit your code to:

    $i=0;
    foreach ($messageRepo as $oneMessage) {
    $calculatedTime = $oneMessage->getTimeToLive();
    $creationTime = $oneMessage->getCrdate();

    $calculatedTimes = $this->androidService->renderFormat($calculatedTime);
    $expiringDate = $creationTime + $calculatedTime;

    $ausgabe[$i] = array(
        'Time' => key($calculatedTimes),
        'Format' => current($calculatedTimes),
        'Title' => $oneMessage->getMessageTitle(),
        'Text' => $oneMessage->getMessageText(),
        );

    if (time() > $expiringDate) {
       $ausgabe[$i]['Expired'] = $expiringDate;

        } else {
        $ausgabe[$i]['Expired'] = $expiringDate;
        }
$i++;


}
于 2013-01-22T12:43:37.433 に答える