PHP: как сравнить каждый ключ ассоциативного массива с другими, пропуская перестановки?

У меня есть эта (на первый взгляд) простая проблема PHP:
У меня есть ассоциативный массив (который отражает структуру таблицы БД, но это не имеет значения, здесь), как этот:

----------------------------------
id  | name            | phone
----------------------------------
1 | alice           | 12345678
3 | bob             | 56789012
9 | zorro           | 90123456
... | ...             | ...
----------------------------------

Мне нужно перебрать массив, чтобы сравнить (скажем, проверить, что нет двух человек с одинаковым номером телефона) каждый ключ со всеми остальными, избегая дублирования проверок, таких как check (1, 3) и check (3, 1) … (Я думаю, что я могу назвать эти duplicationsот эквивалентной математической концепции).

<?php
$table = [
[
"id" => "1",
"name" => "alice",
"phone" => "12345678",
], [
[
"id" => "3",
"name" => "bob",
"phone" => "56789012",
], [
[
"id" => "9",
"name" => "zorro",
"phone" => "90123456",
],
];
?>

Вот что я пытаюсь:

<?php
foreach ($table as $record1) {
foreach ($table as $record2) {
check($record1["phone"], $record2["phone"]);
}
}
?>

Но, конечно, это дублирует проверки …
Обычно (в C languageНапример, я бы последовательно перебирал массив, начиная внутренний цикл с индекса рядом с текущим индексом внешнего цикла … Но в PHP мне сказали, что я не могу последовательно перебирать ассоциативный массив … 🙁

Итак, вопрос: Как перебрать ассоциативный массив PHP, чтобы применить функцию к любой паре клавиш, избегая перестановок?

0

Решение

Вы можете сделать это так же, как в C:

$len = count($table);
for($i = 0; $i < $len - 1; $i++)
for($j = $i + 1; $j < $len; $j++)
compare table[$i] and table[$j]

Если ваши ключи не последовательные, итерируйте массив ключей (который является последовательным) вместо фактического массива:

$keys = array_keys($table);
$len = count($keys);
for($i = 0; $i < $len - 1; $i++)
for($j = $i + 1; $j < $len; $j++)
compare table[keys[$i]] and table[keys[$j]]
1

Другие решения

Вы можете использовать in_array для этого:

foreach ($table as $record1) {
if(in_array($record1["phone"], $table){

}
}

эта проверка, если текущее значение присутствует в массиве. читайте больше здесь: http://php.net/manual/en/function.in-array.php

0

Попробуй это 🙂

<?php

$data = array(
array('id'=>'1','name'=>'test1','phone'=>'1231231234'),
array('id'=>'2','name'=>'test2','phone'=>'1231231235'),
array('id'=>'3','name'=>'test2','phone'=>'1231231234')
);

// sort and find duplicate numbers
$ch = array();
$duplicate = array();
foreach($data as $k=>$d){
if(in_array($d['phone'],$ch)){
$duplicate[] = $k;
}else{
$ch[$k]=$d['phone'];
}
}
// remove duplicated numbers from the initial table array
if($duplicate){
foreach($duplicate as $r)
unset($data[$r]);
}
// now we have only unique numbers
echo '<pre>';
print_r($data);
echo '</pre>';
0
По вопросам рекламы [email protected]