0

たとえば、次のような配列があります。

<?php
$array = array(
  0 => array(
     'subject' => 'Stackoverflow',
     'body'    => '',
     'name'    => 'php'
   ),
  1 => array(
     'subject' => 'Test',
     'body'    => 'Wayne',
     'name'    => ''
   ),
  2 => array(
     'subject' => '',
     'body'    => 'this is ok',
     'name'    => ''
   ),
  3 => array(
     'subject' => 'cnn',
     'body'    => 'Google',
     'name'    => 'private'
   ),
  4 => array(
     'subject' => 'code',
     'body'    => '',
     'name'    => '7777'
   )
);

そして、キー2の件名、本文、および名前を取得したいと思います。キーが存在しない場合、これは前と次の(別の関数)値から取得する必要があります。

たとえば、2 つのキーから値を取得する場合:

function getCurrentOrPrevious(2); 

返す必要があります:

   array(
     'subject' => 'Test', //from [1]
     'body'    => 'this is ok', //from [2] - current and exist
     'name'    => 'php' //from [0] - in from [2] and [1] not exist
   )

function getCurrentOrNext(2); 

返す必要があります:

   array(
     'subject' => 'cnn', //from [3]
     'body'    => 'this is ok', //from [2] - current
     'name'    => 'php' //from [3] 
   )

これにはどのように最善の方法がありますか?そのような操作のための PHP の関数はありますか?

住む

4

3 に答える 3

0
function getCurrentOrPrev($array, $key) {
    while(key($array)!==$key) next($array); //move internal pointer to required position first
    $result = current($array);

    //loop is going to execute as long as at least one of elements is empty and we didn't get to beginning of array yet
    while((empty($result['subject'])
          || empty($result['body'])
          || empty($result['name'])) 
          && prev($array)!==false) {
        $c = current($array);
        //replace empty elements with values of current element
        $result['subject'] = empty($result['subject']) ? $c['subject'] : '';
        $result['body'] = empty($result['body']) ? $c['body'] : '';
        $result['name'] = empty($result['name']) ? $c['name'] : '';
    }

    return $result;
}

prev()次の関数の場合は、単にメソッドをに置き換えるnext()か、コードの重複を最小限に抑えるために、3 番目のパラメーターを導入し、その値に基づいて正しいメソッドを呼び出すことができます。

このメソッドは、パラメーターで指定されたキー以外のキーの値を気にしません。リテラル索引と数値索引が混在している可能性があります。

于 2013-10-03T19:41:31.847 に答える