在一个关联数组数组中搜索两个匹配的参数

时间:2016-02-08 16:10:48

标签: php arrays php-5.3

我有一个循环,它构建一个如下所示的关联数组:

array(
    'foo' => '',
    'bar' => '',
    'thingys' => array()
)

在循环的每次迭代中,我想在数组中搜索一个关联数组,该数组的“foo”和“bar”属性与当前关联数组的属性相匹配。如果它存在,我想将当前关联数组的thingys属性追加到匹配项。否则追加整个事情。 我知道如何使用for循环执行此操作,但我想知道是否有更简单的方法使用数组函数执行此操作。我在php 5.3上。

实施例

<?php 
$arr = array(
    array(
        'foo' => 1,
        'bar' => 2,
        'thing' => 'apple'
    ),
    array(
        'foo' => 1,
        'bar' => 2,
        'thing' => 'orange'
    ),
    array(
        'foo' => 2,
        'bar' => 2,
        'thing' => 'apple'
    ),
);

$newArr = array();
for ($i=0; $i < count($arr); $i++) {
    $matchFound = false;
    for ($j=0; $j < count($newArr); $j++) { 
        if ($arr[$i]['foo'] === $newArr[$j]['foo'] && $arr[$i]['bar'] === $newArr[$j]['bar']) {
            array_push($newArr[$j]['thing'], $arr[$i]['things']);
            $matchFound = true;
            break;
        }
    }
    if (!$matchFound) {

        array_push($newArr,
            array(
                'foo' => $arr[$i]['foo'],
                'bar' => $arr[$i]['bar'],
                'things' => array($arr[$i]['thing'])
            )
        );
    }
}

/*Output
$newArr = array(
    array(
        'foo' => 1,
        'bar' => 2,
        'things' => array('orange', 'apple')
    ),
    array(
        'foo' => 2,
        'bar' => 2,
        'things' => array('apple')
    ),
)
*/
 ?>

1 个答案:

答案 0 :(得分:0)

我不知道是否可以通过内置功能,但我认为不行。有些东西可以通过private void itemClicked(int position) { if (expandedPosition == -1) { // selected first item expandedPosition = position; notifyItemChanged(position); } else if (expandedPosition == position) { // collapse currently expanded item expandedPosition = -1; notifyItemChanged(position); } else { // collapse previously expanded item and expand new item int oldExpanded = expandedPosition; expandedPosition = position; notifyItemChanged(oldExpanded); notifyItemChanged(position); } } 实现,但无论如何你必须执行双循环。

我建议您使用临时数组(array_map)作为已创建的$keys项的索引的单循环解决方案,基于$newArrfoo;原始数组的元素通过bar循环处理,如果foreach元素的第一个键为$keys值,第二个键为foo值,则当前{ {1}}值被添加到返回的密钥索引bar,否则会创建一个新的thing元素。

$newArr

eval.in demo

编辑:array_map变体

这与上面的解决方案相同,使用$newArray代替$newArr = $keys = array(); foreach( $arr as $row ) { if( isset( $keys[$row['foo']][$row['bar']] ) ) { $newArr[$keys[$row['foo']][$row['bar']]]['thing'][] = $row['thing']; } else { $keys[$row['foo']][$row['bar']] = array_push( $newArr, $row )-1; $newArr[$keys[$row['foo']][$row['bar']]]['thing'] = array( $row['thing'] ); } } unset( $keys ); 循环。请注意,您的原始代码也可以这种方式转换。

array_map

eval.in demo