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;
}

对于带有 next 的函数,只需将prev()方法替换为next(),或尽量减少代码重复 您可以引入第三个参数并根据其值调用正确的方法。

此方法不关心其他键的值,而是参数中指定的键。您可能有混合的文字和数字索引。

于 2013-10-03T19:41:31.847 回答
0

我想你可以使用php 的empty()函数来检查。您还应该考虑该功能外壳能走多远?

  • 如果[3](next) 在同一位置也有一个空值怎么办
  • 如果先前的索引是<0怎么办?

更新

function getCurrOrNext($array, $index){
    $keys = array_keys($array[$index]);
    foreach($keys AS $key){
        if($array[$index][$key] == "") {
            $array[$index][$key] = (!empty($array[$index+1]) && !empty($array[$index+1][$key])?$array[$index+1][$key]:null);
        }
    }
    return $array;
}

我猜是这样的

于 2013-10-03T18:39:04.187 回答
0

假设,你填充你的数组类似于 $array[] = $value; [即你有从零开始的连续数字键]:

## $array is the array to take values from, $key is the target key
## $fields are required fields
function getCurrentOrPrevious($array, $key, $fields) {
    if ($key < 0) return null;
    $output = array();
    foreach ($fields as $field) {
       for ($i = $key; $i >= 0; $i--) {
         if (!empty($array[$i][$field])) {
            $output[$field] = $array[$i][$field];
            break;
         }
    }
    return $output;
}

使用如下:

$my_values = getCurrentOrPrevious($array, 12, array('subject', 'body', 'name'));
于 2013-10-03T18:43:14.817 回答