搜索数组并使用结果创建一个新数组

时间:2015-03-25 14:33:37

标签: php arrays multidimensional-array

我需要搜索数组并希望返回结果,如下面提供的示例所示。

我知道我可以循环遍历数组,但我想知道是否有更好的方法来执行此操作,因为这将搜索大量数据。

搜索这样的数组:

// initial array
$search_thru = array(
    array('member_id' => 6, 'field_id_1' => 'some data', 'field_id_5' => NULL),
    array('member_id' => 15, 'field_id_1' => NULL, 'field_id_5' => NULL),
    array('member_id' => 21, 'field_id_1' => 'this field too', 'field_id_5' => 'this field has some data');
);

搜索数组,如果member_id有任何等于NULL的键,则将其添加到结果数组中。

member_id应该是新数组中数据集的关键。 密钥的数据不应该是值为NULL的密钥的全名,只是数字。

示例:field_id_1 => 1

// expected result
$result = array(
    6 => array(5),
    15 => array(1, 5),
);

提前致谢。

3 个答案:

答案 0 :(得分:1)

虽然有更好的数组操作函数,但当需要进行密钥更改时,foreach循环似乎是一种简单的方法:

<?php

$haystack = array(
  array('member_id' => 6, 'field_id_1' => 'some data', 'field_id_5' => NULL),
  array('member_id' => 15, 'field_id_1' => NULL, 'field_id_5' => NULL),
  array('member_id' => 21, 'field_id_1' => 'this field too', 'field_id_5' => 'this field has some data'),
);

$result = array();
foreach($haystack as $row) {
  if(in_array(null, $row)) {
    $result[$row['member_id']] = array();

    foreach($row as $key => $value) {
      if($value === null) {
        $result[$row['member_id']][] = str_replace('field_id_', '', $key);
      }
    }
  }
}

答案 1 :(得分:1)

您可以在功能样式中执行部分操作,但PHP array_map不允许您使用数组键,因此foreach似乎是最简单的方法输出您需要的格式:

<?php

function strip_prefix( $string ) {
  $prefix = 'field_id_';
  return explode( $prefix, $string )[1];
}

function get_null_fields( $member ) {
  $null_keys = array_keys( $member, NULL, true ); // get all keys with NULL values
  return array_map( 'strip_prefix', $null_keys );
}

// initial array
$search_thru = array(
    array('member_id' => 6,  'field_id_1' => 'some data', 'field_id_5' => NULL),
    array('member_id' => 15, 'field_id_1' => NULL, 'field_id_5' => NULL),
    array('member_id' => 21, 'field_id_1' => 'this field too', 'field_id_5' => 'this field has some data')
);

$tmp = array();
foreach ( $search_thru as $member ) {
  $tmp[ $member['member_id'] ] = get_null_fields($member);
}

$result = array_filter( $tmp, 'count' ); // remove items with no null fields

print_r($result);

答案 2 :(得分:-3)

我认为您可以使用array_search()in_array()

实际上你可以使用array_keys应该是正确的功能。 它应该返回与该值匹配的所有键,然后您可以轻松地遍历键以执行您需要的任何操作。

如果您有许多空值,这种方法可能不仅仅比循环遍历整个数据集更有效。