比较三个数组中的值并在php中获取特定值

时间:2015-09-07 03:53:39

标签: php arrays

我正在比较一个数组中的三个值,我得到了所有的价值。

如何输出我只想输出的特定值或值

因为我想输出我唯一需要的值。

我有这段代码:

<?php
$participants = [
    [   'calleridnum' => 1,
        'callee' => 'yay' 
    ],
    [   'calleridnum' => 2,
        'callee' => 'yay' 
    ],
     [  'calleridnum' => 3,
        'callee' => 'yay' 
    ]
];
$conferance_participants = [
    [   'uid' => 1,
        'caller' => 'yay2',
        'dit' => 'deze'
    ],
    [   'uid' => 2,
        'caller' => 'test',
        'dit' => 'wew'
    ]
];
$contacts = [
    [   'name' => 1,
        'test' => 'yay2',
        'limit' => 1
    ],
    [   'name' => 2,
        'test' => 'yay2',
        'limit' => 1
    ]
];



    foreach ($participants as $participant=>$p) {
        foreach ($conferance_participants as $conferance_participant=>$cp) {
            foreach ($contacts as $contact=>$cs) {

                if (($p['calleridnum'] == $cp['uid']) && ($cp['uid'] == $cs['name'])){
                     $conferance_participants[$conferance_participant] = array_merge(
                     $participants[$participant],
                     $conferance_participants[$conferance_participant],
                     $contacts[$contact]
                );

                }
            } 

        } 

    }

echo "<pre>";
print_r($conferance_participants);
echo "</pre>";

?>

我的输出是:

Array
(
    [0] => Array
        (
            [calleridnum] => 1
            [callee] => yay
            [uid] => 1
            [caller] => yay2
            [dit] => deze
            [name] => 1
            [test] => yay2
            [limit] => 1
        )

    [1] => Array
        (
            [calleridnum] => 2
            [callee] => yay
            [uid] => 2
            [caller] => test
            [dit] => wew
            [name] => 2
            [test] => yay2
            [limit] => 1
        )

)

我想要最小化我的输出。

我想从$ contacts数组中删除name test

我还想从$ conferance_participants数组中删除caller dit

这样我的输出就是:

Array
(
    [0] => Array
        (
            [calleridnum] => 1
            [callee] => yay
            [uid] => 1
            [limit] => 1
        )

    [1] => Array
        (
            [calleridnum] => 2
            [callee] => yay
            [uid] => 2
            [limit] => 1
        )

)

3 个答案:

答案 0 :(得分:1)

您的代码很难理解,

foreach执行的次数,

count($participants) * count($conferance_participants) * count($contacts);

此代码foreach执行的次数将等于或小于您的代码,因为它会在找到匹配后立即停止。

此外,我已经创建了一个新功能,用于搜索另一个数组,因此它将使下一个处理此代码的人不再在桌面上敲击。

$conferance_participants变量的值作为参考,请注意foreach声明中的 & ,因此无需担心数组的键。

foreach($conferance_participants as &$record) {
    # find keys of corresponding array matches
    $key_in_participants = _custom_search($record['uid'], $participants, 'calleridnum');
    $key_in_contacts = _custom_search($record['uid'], $contacts, 'name');

    # unset unwanted things
    unset($record['caller'], $record['dit']);

    # activate this code if you want to make false for unmatched records
    /* ***********************************************************************
    if($key_in_participants === false || $key_in_contacts === false) {
        $record['calleridnum'] = $record['callee'] = $record['limit'] = false;
        continue;
    }
    *********************************************************************** */ 

    # setting required things
    $record['calleridnum'] = $participants[$key_in_participants]['calleridnum'];
    $record['callee'] = $participants[$key_in_participants]['callee'];
    $record['limit'] = $contacts[$key_in_contacts]['limit'];
}

function _custom_search($id, $array, $key_to_search) {
   foreach ($array as $key => $val) if($val[$key_to_search] === $id) return $key;
   return false;
}

这将使$conferance_participants完全符合您的要求。

答案 1 :(得分:0)

您可以在合并阵列之前取消设置数组键。然后再为$ contacts数组设置'name'键,这是上面循环所需的。

以下是修改后的代码示例:

<?php

    $participants = [
        [   'calleridnum' => 1,
            'callee' => 'yay'
        ],
        [   'calleridnum' => 2,
            'callee' => 'yay'
        ],
         [  'calleridnum' => 3,
            'callee' => 'yay'
        ]
    ];
    $conferance_participants = [
        [   'uid' => 1,
            'caller' => 'yay2',
            'dit' => 'deze'
        ],
        [   'uid' => 2,
            'caller' => 'test',
            'dit' => 'wew'
        ]
    ];
    $contacts = [
        [   'name' => 1,
            'test' => 'yay2',
            'limit' => 1
        ],
        [   'name' => 2,
            'test' => 'yay2',
            'limit' => 1
        ]
    ];

        foreach ($participants as $participant=>$p) {
            foreach ($conferance_participants as $conferance_participant=>$cp) {
                foreach ($contacts as $contact=>$cs) {

                    if (($p['calleridnum'] == $cp['uid']) && ($cp['uid'] == $cs['name'])){

                         unset($contacts[$contact]['name'], $contacts[$contact]['test']);
                         unset($conferance_participants[$conferance_participant]['caller'], $conferance_participants[$conferance_participant]['dit']);

                         $conferance_participants[$conferance_participant] = array_merge(
                         $participants[$participant],
                         $conferance_participants[$conferance_participant],
                         $contacts[$contact]
                        );

                         $contacts[$contact]['name'] = $cs['name'];

                    }
                }

            }

        }

    echo "<pre>";

    print_r($conferance_participants);

    echo "</pre>";

你应该得到的输出:

Array
(
    [0] => Array
        (
            [calleridnum] => 1
            [callee] => yay
            [uid] => 1
            [limit] => 1
        )

    [1] => Array
        (
            [calleridnum] => 2
            [callee] => yay
            [uid] => 2
            [limit] => 1
        )

)

我希望能回答你的问题。感谢。

答案 2 :(得分:-1)

合并后,您可以使用array_intersect_key()过滤您希望在最终结果中出现的某些键。

$keys = array_flip(['calleridnum', 'callee', 'uid', 'limit']);

$conferance_participants[$conferance_participant] =
    array_intersect_key(
        array_merge(
            $participants[$participant],
            $conferance_participants[$conferance_participant],
            $contacts[$contact]
        ),
        $keys
    );