【问题标题】:php Get the original key value in in_array multidimensionalphp获取in_array多维中的原始键值
【发布时间】:2017-06-07 14:54:28
【问题描述】:

我有一个带有一些重复子数组的多维数组:

 $data = array(
    2 => array  (
            'User'      => 'cat',
            'File_name' => 'cat.docx',
            'Document'  => 'Document1',
            'Date'      => '2017-03-02',
            'Pages'     => 1
        ),
    3 => array  (
            'User'      => 'dog',
            'File_name' => 'dog.docx',
            'Document'  => 'Document2',
            'Date'      => '2017-03-02',
            'Pages'     => 3
        ),
    4 => array  (
            'User'      => 'shark',
            'File_name' => 'shark.docx',
            'Document'  => 'Document3',
            'Date'      => '2017-03-01',
            'Pages'     => 5
        ),
    5 => array  (
            'User'      => 'dog',
            'File_name' => 'dog.docx',
            'Document'  => 'Document2',
            'Date'      => '2017-03-02',
            'Pages'     => 3
    ),
    6 => array  (
            'User'      => 'dog',
            'File_name' => 'dog.docx',
            'Document'  => 'Document2',
            'Date'      => '2017-03-02',
            'Pages'     => 3
    ),
    //...
);

我可以识别出重复的项目:

$final = $dupli = array();
foreach ($data as $key => $array ) {
    if(!in_array($array, $final)){
        $final[$key] = $array;
    }
    else
    {
        $dupli[$key] = $array;
    }
}
print_r($dupli);

但我想知道找到的第一个子数组(this 的键)是什么索引,作为消息,例如:

 $final = $dupli = array();
    foreach ($data as $key => $array ) {
        if(!in_array($array, $final)){
            $final[$key] = $array;
        }
        else
        {
            $dupli[$key] = $array;
            echo "Line " . $key . " duplicated row, the original row is: " . $originalkey;
        }
    }

输出:

Line 5 duplicated row, the original row is: 3 
Line 6 duplicated row, the original row is: 3 

【问题讨论】:

  • 当 user = cat 时,这是否意味着其他值也相等,或者它们可能不同?
  • 子数组中的所有项必须相等
  • 我理解,但在您的示例中,对于所有带有 user=cat 的记录,例如子数组的其他元素都是相等的。这总是正确的还是子数组也可以是user=cat, file_name=xmas.docx, document=somethingelse等等
  • 用户和文件名(以及其他)没有关系,只是和例子。

标签: php multidimensional-array duplicates


【解决方案1】:

要查找具有特定值的键,可以使用array_search()

因此,要从最终数组中获取密钥,应该在您的 else 语句中执行此操作:

$dupli[$key] = $array;
$originalkey = array_search($array, $final);
echo "Line " . $key . " duplicated row, the original row is: " . $originalkey . "\n";

Read more about array_search() in the docs

【讨论】:

    【解决方案2】:

    正如 Magnus Eriksson 所说,您可以使用 array_search,如果您在现有循环中使用它而不是 in_array,则每个循环只能执行一次操作:

     $final = $dupli = array();
     foreach ($data as $key => $array ) {
        if(($originalkey = array_search($array, $final)) === false){
            $final[$key] = $array;
        }
        else
        {
            $dupli[$key] = $array;
            echo "Line " . $key . " duplicated row, the original row is: " . $originalkey;
        }
    }
    

    【讨论】:

    • 你的逻辑倒退了
    【解决方案3】:

    array_search() 与循环一起使用,您可以简化代码,如下所示:

    foreach($data as $index => $value)
    {
        $key = array_search($value, $data);
        if($key!==false && $key != $index){
            printf("Line %d duplicated row, the original row is: %d\n",$index, $key);
        }
    }
    

    CLI 上的测试结果

    脚本

    akshay@db-3325:/tmp$ cat test.php 
    <?php
    $data = array(
        2 => array  (
                'User'      => 'cat',
                'File_name' => 'cat.docx',
                'Document'  => 'Document1',
                'Date'      => '2017-03-02',
                'Pages'     => 1
            ),
        3 => array  (
                'User'      => 'dog',
                'File_name' => 'dog.docx',
                'Document'  => 'Document2',
                'Date'      => '2017-03-02',
                'Pages'     => 3
            ),
        4 => array  (
                'User'      => 'shark',
                'File_name' => 'shark.docx',
                'Document'  => 'Document3',
                'Date'      => '2017-03-01',
                'Pages'     => 5
            ),
        5 => array  (
                'User'      => 'dog',
                'File_name' => 'dog.docx',
                'Document'  => 'Document2',
                'Date'      => '2017-03-02',
                'Pages'     => 3
        ),
        6 => array  (
                'User'      => 'dog',
                'File_name' => 'dog.docx',
                'Document'  => 'Document2',
                'Date'      => '2017-03-02',
                'Pages'     => 3
        ),
        //...
    );
    
    
    foreach($data as $index => $value)
    {
        $key = array_search($value, $data);
        if($key!==false && $key != $index){
            printf("Line %d duplicated row, the original row is: %d\n",$index, $key);
        }
    }
    
    
    
    ?>
    

    输出

    akshay@db-3325:/tmp$ php test.php 
    Line 5 duplicated row, the original row is: 3
    Line 6 duplicated row, the original row is: 3
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-02-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-25
      • 1970-01-01
      • 2013-04-03
      相关资源
      最近更新 更多