【问题标题】:PHP: Compare key value of objectsPHP:比较对象的键值
【发布时间】:2019-12-19 09:31:29
【问题描述】:

我有两个数组,每个数组都包含一组对象

$input = [
    (object)[
        'id'       => 2,
        'number'   => 54523,
        'date'     => '2019-12-17',
        'book_for' => 'tttt',
        'subject'  => 'tttt',
        'content'  => 'ttt',
        'language' => 'Arabic',
        'cpfor'    => 'tt',
        'book_key' => '2WHae',
        'note'     => 'ttt',
        'type'     => 'Internal',
        'pid'      => 2,
        'bookid'   => 2,
        'process'  => 'STA',
    ],
];

第二个数组是

$answers = [
    (object)[
        'aid'             => 1,
        'a_number'        => 0,
        'answer_of'       => 1,
        'answer_date'     => '2019-12-17 00:00:00',
        'answer_for'      => 'xcc',
        'answer_subject'  => 'DSF',
        'answer_content'  => 'FSD',
        'language'        => '',
        'cpfor'           => 'WE',
        'note'            => 'EWWE',
    ],
    (object)[
       'aid'            => 2,
       'a_number'       => 0,
       'answer_of'      => 2,
       'answer_date'    => '2019-12-19 00:00:00',
       'answer_for'     => 'answer for tt',
       'answer_subject' => 'answer for tt',
       'answer_content' => 'answer for tt',
       'language'       => 'Arabic',
       'cpfor'          => 'answer for ttvv',
       'note'           => 'answer for tt',
   ],
];

我想循环并比较第一个 array 中的 id 键的值与第二个 array 中的 answer_of 键的值,如果 idanswer_of 不同,则返回此对象否则如果 id 在第二个数组中不存在,则忽略其他意思(answer_of)返回具有所有键和值的对象,否则忽略 我尝试了下面的函数,但甚至得到那些存在于第二个数组中的函数

function unanswered2($array1, $array2)
{
    if (!(empty($array2))) {
        $unanswered_arrays = [];
        foreach ($array1 as $b) {
            foreach ($array2 as $a) {
                if ($b->bookid != $a->answer_of) {
                    array_push($unanswered_arrays, (object)$b);
                }
            }
        }

        return $unanswered_arrays;
    }

    return $array1;
}

任何人都可以告诉我哪里有错误或任何建议

结果是

$result=unanswered2($input,$answers);

  $result= [
    (object)[
        'id'       => 2,
        'number'   => 54523,
        'date'     => '2019-12-17',
        'book_for' => 'tttt',
        'subject'  => 'tttt',
        'content'  => 'ttt',
        'language' => 'Arabic',
        'cpfor'    => 'tt',
        'book_key' => '2WHae',
        'note'     => 'ttt',
        'type'     => 'Internal',
        'pid'      => 2,
        'bookid'   => 2,
        'process'  => 'STA',
    ],
];

它应该忽略它而不返回

【问题讨论】:

  • 你当前的输出是多少?什么是预期的输出 ?请您使用var_export() 而不是var_dump(),以便我们可以复制粘贴并进行测试?
  • 这能回答你的问题吗? PHP object key value comparison of array indexes
  • @EzzatHarky 请也添加预期结果
  • @AksenP 不,我没有得到答案
  • @Shibon 添加结果

标签: php arrays loops object foreach


【解决方案1】:

我认为最简单的解决方案是使用array_filter 和一个准备好的answer_of 值列表(您可以使用array_column)。

这是一个例子:

function findUnanswered(array $questions, array $answers): array
{
    // use array_column to prepare a list of `answer_of` values
    // *array_flip* them, so we can later use isset for better performance
    $availableAnswers = array_flip(array_column($answers, 'answer_of'));

    // filter all questions 
    return array_filter(
        $questions,

        // by a callback function, that
        static function (object $question) use($availableAnswers): bool {
            //                                            ^ which we *use* from the outer scope
            //                                            |
            // checks if the question id is [not set]* in +
            //                              (* meaning no answer exists)
            return !isset($availableAnswers[$question->id]);
        }
    );
}

演示:https://3v4l.org/ZKlNn

【讨论】:

  • @EzzatHarky 请用更多的词来解释“错误的结果”。
【解决方案2】:

我已经阅读了您对上一个我的回答的评论...

function getDiff($ar1, $ar2){

    return array_filter($ar2, function($obj) use ($ar1) { 
        foreach($ar1 as $obj1){
            return $obj1->bookid !== $obj->answer_of;
        } 
    }, ARRAY_FILTER_USE_BOTH);
}

print_r(getDiff($input,$answers));

输出:

Array
(
    [0] => stdClass Object
        (
            [aid] => 1
            [a_number] => 0
            [answer_of] => 1
            [answer_date] => 2019-12-17 00:00:00
            [answer_for] => xcc
            [answer_subject] => DSF
            [answer_content] => FSD
            [language] => 
            [cpfor] => WE
            [note] => EWWE
        )

)

https://3v4l.org/oGQWS

【讨论】:

    【解决方案3】:

    如果您不关心 answers 数组中的原始键。

    输入:

    <?php
    $input = [
        (object)[
            'id'       => 2,
            'number'   => 54523,
            'date'     => '2019-12-17',
            'book_for' => 'tttt',
            'subject'  => 'tttt',
            'content'  => 'ttt',
            'language' => 'Arabic',
            'cpfor'    => 'tt',
            'book_key' => '2WHae',
            'note'     => 'ttt',
            'type'     => 'Internal',
            'pid'      => 2,
            'bookid'   => 2,
            'process'  => 'STA',
        ],
    ];
    $answers = [
        (object)[
            'aid'             => 1,
            'a_number'        => 0,
            'answer_of'       => 1,
            'answer_date'     => '2019-12-17 00:00:00',
            'answer_for'      => 'xcc',
            'answer_subject'  => 'DSF',
            'answer_content'  => 'FSD',
            'language'        => '',
            'cpfor'           => 'WE',
            'note'            => 'EWWE',
        ],
        (object)[
           'aid'            => 2,
           'a_number'       => 0,
           'answer_of'      => 2,
           'answer_date'    => '2019-12-19 00:00:00',
           'answer_for'     => 'answer for tt',
           'answer_subject' => 'answer for tt',
           'answer_content' => 'answer for tt',
           'language'       => 'Arabic',
           'cpfor'          => 'answer for ttvv',
           'note'           => 'answer for tt',
       ],
    ];
    

    方法:

    $unanswered = array_diff_key(
        array_column($answers, null, 'answer_of'),
        array_column($input, null, 'id')
    );
    
    var_export($unanswered);
    

    输出:

    array (
        1 => 
        stdClass::__set_state(array(
           'aid' => 1,
           'a_number' => 0,
           'answer_of' => 1,
           'answer_date' => '2019-12-17 00:00:00',
           'answer_for' => 'xcc',
           'answer_subject' => 'DSF',
           'answer_content' => 'FSD',
           'language' => '',
           'cpfor' => 'WE',
           'note' => 'EWWE',
        )),
      )
    

    【讨论】:

      猜你喜欢
      • 2020-04-10
      • 2021-07-10
      • 1970-01-01
      • 2021-05-30
      • 2018-11-03
      • 1970-01-01
      • 2019-01-07
      • 1970-01-01
      相关资源
      最近更新 更多